Class GameDev* SheepAdult

[Unreal Engine / Unity] Deltatime - 패키징한 게임과 에디터에서의 게임의 속도 차이에 대하여 (Speed ​​difference between editor and package) 본문

Unreal Engine

[Unreal Engine / Unity] Deltatime - 패키징한 게임과 에디터에서의 게임의 속도 차이에 대하여 (Speed ​​difference between editor and package)

SheepAdult 2023. 4. 9. 16:06

 에디터에서 원하던 대로 작동하던 코드가 패키징을 하거나 에디터에서 독립형 게임으로 실행을 시킬 경우 물체를 움직이거나 게이지를 채운다거나 하는 행동에 속도 차이가 생길 수 있다. 이는 프로그램을 실행하는 하드웨어의 속도가 다르기 때문에 생기는 문제이다. 이러한 문제의 해결법으로는 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을 곱하여 문제가 발생하지 않는 것이 중요할 것 같다.