한 줄 요약: Time.realtimeSinceStartup은 정확도가 떨어지니 Time.unscaledTime을 사용합시다.

 

 

Time~ 으로 시작하는 Debug 로그는 while(true) 문 안에서 10초를 대기하며 반복적으로 찍은 사진이다.

 

yield return new WaitForSeconds(10); 을 사용해서 코루틴이 못미더웠는데, 실제로는 Time.realtimeSinceStartup이 문제였다.

 

프로젝트에서 시간을 누적할 때 Time.realtimeSinceStartup를 사용했는데, 대략적인 시간은 맞지만 간혹 오차가 발생하는 경우가 있었다.

 

Time: { Time.realtimeSinceStartup }, Double: { Time.realtimeSinceStartupAsDouble }, unscaled: { Time.unscaledTime }

 

위 로그는 이렇게 찍은 로그이고, 위 사진 1 -> 2번째 로그에서 문제가 발생한 것을 확인할 수 있다.

 

Time.realtimeSinceStartup: 9.91145초 경과

Time.realtimeSinceStartupAsDouble: 9.9114010000012초 경과

Time.unscaledTime: 10.0143초 경과

 

yield return new WaitForSeconds(10); 으로 10초를 대기했으나, Time.realtimeSinceStartup, Time.realtimeSinceStartupAsDouble은 10초가 경과하지 않았다!

 

코루틴이 못미더워서 Update에서 deltaTime으로 시간을 누적해서 확인해보기도 했는데, 실제로는 10초가 지난 상태였다.

 

즉 Time.realtimeSinceStartup가 정확하지 않다는 소리이다.

Time.realtimeSinceStartupAsDouble도 미묘하게 정확해보이지만 부정확하다는 것을 알 수 있다.

 

대략 0.1초 이내로 오차가 발생하는데, 짧으면 5분 / 길면 30분에 1번 꼴로 발생한다.

 

Time.unscaledTime을 사용하는 것으로 대체했고, 이후 오차가 발생하는 것은 아직까지 발견하지 못했다.

 

Unity - Scripting API: Time.realtimeSinceStartup (unity3d.com)

 

Unity - Scripting API: Time.realtimeSinceStartup

This is the time in seconds since the start of the application, and is not constant if called multiple times in a frame. Time.timeScale does not affect this property. In almost all cases you should use Time.time or Time.unscaledTime instead. If you do need

docs.unity3d.com

 

유니티 문서에서도 웬만하면 Time.unscaledTime을 대신 사용하라고는 되어있지만... 기존에 잘 돌아가던 코드 + Unity에서 제공하는 기능이라 어느정도 믿음이 있었는데 발등 찍혔다.

 

시간의 정확도가 중요하다면 Time.realtimeSinceStartup 대신에 Time.unscaledTime을 사용하도록 하자.

+ Recent posts