[Unreal Engine / Unity] Deltatime - 패키징한 게임과 에디터에서의 게임의 속도 차이에 대하여 (Speed difference between editor and package)
에디터에서 원하던 대로 작동하던 코드가 패키징을 하거나 에디터에서 독립형 게임으로 실행을 시킬 경우 물체를 움직이거나 게이지를 채운다거나 하는 행동에 속도 차이가 생길 수 있다. 이는 프로그램을 실행하는 하드웨어의 속도가 다르기 때문에 생기는 문제이다. 이러한 문제의 해결법으로는 deltatime이 있다. deltatime은 1초를 fps값으로 나눈 값을 저장하는 변수이다. 예를 들어, 60fps인 경우, 1 / 60 (0.01666...)을 detatime으로 저장한다.
그럼 이게 왜 해결책이 될까? 만약 Unreal의 경우 Tick함수, Unity의 경우 Update함수에서 일반적으로 1프레임마다 함수를 호출하게 되는데, 방금 말했듯이 하드웨어의 속도가 60 혹은 30 등 fps가 다르면 계산한 결과 값이 다를 수 있다.
예를 들어 distance란 float 변수에 1씩을 더해보자
// 선언
float distance = 0.0f;
// Tick() or Update()
distance += 1;
위의 코드에 따르면 만약 60fps의 하드웨어라면 60 * 1의 결과가 나올 것이고 30fps라면 30 * 1의 결과가 나올 것이다. 그러면 속도에 대한 차이가 생기므로 의도치 않은 플레이가 연출될 수 있기에 deltatime을 사용한다. 위의 결과에 deltatime을 곱해주는 것이다. Unreal에서는 tick의 인자인 deltatime을 사용하거나 FApp::GetDeltaTime() 함수를 사용하고, Unity의 경우 Time.deltaTime을 사용한다.
// 선언
float distance = 0.0f;
// Tick() or Update()
distance += 1 * FApp::GetDeltaTime();
위의 코드는 결국 다음과 같다.
- 60fps
60 * 1 * 0.016666... ≒ 1
- 30fps
30 * 1* 0.033333.... ≒ 1
위와 같이 하드웨어의 차이에도 거의 근접한 계산값을 이끌어 낼 수 있다. 즉, Tick 이나 Update함수에서는 deltatime을 곱하여 문제가 발생하지 않는 것이 중요할 것 같다.