공부 좀 하자/Unity

Unity Time.deltaTime 과 Time.smoothDeltaTime 에 대하여

개발성문 2018. 3. 29. 15:13

이번 포스팅은 Time.deltaTime 과  Time.smoothDeltaTime 에 대한 내용을 정리해보려고 합니다. 


이 내용을 나가기에 앞서 프레임(Frame)에 대해서 그리고 Unity 의 Update() 함수에 대해 먼저 알아볼께요.



프레임(Frame)은 주로 게임이나 영화, 애니메이션 등에서 언급 되죠.


프레임(Frame)이란 우리가 화면에 보는 정지 영상 한 장을 말합니다. 


이 한장의 프레임이 어려장 모여서 움직임을 보여주게 되는 것이죠.


게임에서는 초당 프레임 수 라고해서  Frame per second 라고 합니다. 


컴퓨터는 사양이 낮을 수록 프레임 수가 적고, 고사양일 수록 프레임 수가 높다고 하는데요.


그래픽 카드, 저의 경우는 지포스 사용인데 설정에서 프레임 수를 조정 할 수 도 있답니다.



그럼, Unity의 Update() 함수는 무엇일까요.


이 함수는 매 프렘임마다 자동으로 호출 됩니다.  다시 말하면, 프레임당 한 번 호출이 된다는 거죠.


대략 1초에 30 ~60번 호출이 된다고 하는데요. 물론 사양 등에 따라 달라지는 것 같습니다.


어찌되었는 끊임없이 반복되는 함수이기 때문에 중요 핵심 로직 등을 이곳에 작성합니다.




이 함수 안에 1초에 N m 앞으로 전진하는 소스를 적었다고 해보죠.


컴퓨터의 사양에 따라 프레임의 수도 달라지기 때문에 같은 소스라도 결과가 달라질 수가 있습니다. 


30 프레임이라면 => N * 30 프레임 으로 1초에 30N m 를 전진하게 되지만,


60 프레임이라면 => N * 60 프레임 으로 1초에 60N m 를 전진하게 됩니다.


이와 같이 말이죠. 


하지만 여기에 각각 1초에 Update() 함수가 호출되는 횟수를  1/30, 1/60 과 같이 분할하여 이를 더해주면,


30 프레임이라면 => N m * 30 프레임  * ( 1 / 30 )으로 1초에 N m 를 전진하고,


60 프레임이라면 => N * 60 프레임   * ( 1 / 60 )으로 1초에 N m 를 전진하게 됩니다.


프레임이 다르더라도 동일한 결과값를 얻을 수가 있습니다.


Unity 에서는 이것을 Time.deltaTime 이라는 이름으로 지원해주고 있습니다.


Time.deltaTime 은 화면이 한번 깜박이는 한 프레임의 시간을 나타냅니다.


그래서 사양에 따라 결과값이 달라져서 캐릭터의 이동이라던지 그런 것들이 상이해지는 결과를 방지할 수 있게 됩니다.


하지만 여기에도 문제가 있다고 하는데요.


오브젝트가 순간이동 하는 것처럼 워프 현상이 일어난다고 해서 눈에 보이는 시각적인 부분에서는 쓰지 않기를 권장한다


고 합니다. 


이 내용은 제가 공부를 하면서 듣게 된 내용입니다.



그래서 눈에 보이는 시각적인 부분에서 사용하라고 하는 것이 Time.smoothDeltaTime 입니다.


Time.smoothDeltaTime 은 Time.deltaTime을 부드럽게 만든(?) 값 을 나타냅니다.


보다 안정된 값을 가져온다라고 생각하시면 될것 같습니다. 


비교를 위해서 로그를 찍어 보았는데 크게 눈에 띄는 부분은 없지만,

뽑아 보자면 smoothDeltaTime 쪽이 값이 균등하게 나오는 것을 보실 수 있습니다. 


이게 그 차이이지 않을까 싶구요.  그래서 smoothDeltaTime 에는 별도의 설명이 없는게 아닐까 싶네요. 


여기서 마치도록 하겠습니다.