한 줄 요약: 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을 사용하도록 하자.
'개발 > 공부' 카테고리의 다른 글
메모리 관리에 대한 탐구 (10) - Unity에서 Font 관련 용량 줄이기 (2) | 2024.05.12 |
---|---|
비트 연산자를 사용할 때 유의해야 할 점 (0) | 2024.05.12 |
JetBrains Rider의 장점을 활용해서 효율적인 개발하기 (0) | 2023.09.16 |
메모리 관리에 대한 탐구 (9) - Addressables와 메모리 관리 (0) | 2023.08.20 |
메모리 관리에 대한 탐구 (8) - AssetBundle, Scriptable Build Pipeline, Addressables (0) | 2023.08.15 |