1. 개요
Actor를 다루게 되면 가장 처음 접하게 되는 함수인 BeginPlay()와 Tick()을 살펴보는 중에 Tick 함수에서 이동과 같은 로직을 다루게 될 때는 Tick함수의 기본 매개변수로 선언되어 있는 DeltaTime을 다뤄야만 한다. 로직을 구성하면서 생각해 보니 DeltaTime은 이동 로직뿐만 아니라 Tick에서 실행되는 모든 동작 처리에서 중요한 요소이기 때문에 이에 대해 내용 정리를 해보게 되었다.
2. Tick과 DeltaTime
Tick : 게임이 매 프레임마다 수행하는 반복적인 작업들이 구현되어 있는 함수
- 게임이 실행되는 동안 지속적으로 호출
- 게임의 프레임 레이트에 따라 실행
예) FPS=60 ㅡ> 초당 60번 호출, FPS=120 ㅡ> 초당 120번 호출 - 불필요한 Tick까지 활성화하면 지속적으로 호출되기 때문에 성능 저하 유발
ㅡ> Tick은 자원을 많이 소모할 수 있으니 굳이 Tick에서 동작할 필요 없는 것들은 이벤트 기반 시스템, Timer를 활용
DeltaTime : 두 프레임 사이의 간격
- 게임의 프레임 레이트에 따라 두 프레임 사이의 간격이 달라짐
예) FPS=60 ㅡ> DeltaTime=1/60, FPS=120 ㅡ> DeltaTime=1/120 - DeltaTime을 이용하면 프레임 레이트에 관계 없이 일정한 속도 보장 가능 (프레임 독립성)
- 시간 기반 애니메이션 및 물리 연산에 활용
위 코드에서처럼 DeltaTime을 이용해 스피드값을 조절하면 프레임 레이트가 서로 다른 환경에서도 동일한 움직임을 보장할 수 있다.
3. 정리
어떤 리듬게임에서는 이런 DeltaTime에 따른 프레임 독립성을 보장하지 않아 프레임 레이트가 달라지면 떨어지는 노트의 속도가 2배가 되는 해프닝이 일어나기도 한다고 한다. 이 때문에 프레임을 일정 속도 이상 못 올라가게 제한을 두는 방식으로 해결할 수도 있겠지만, 애초에 이런 프레임 독립성을 보장할 수 있도록 게임을 만들어 두는 것이 가장 좋은 해결책일 것이다. 게임을 즐기는 유저들이 좋은 모니터와 컴퓨터를 쓰고도 그 체감을 하지 못하게 하는 것 뿐만 아니라 자체 헬모드를 선사한다면 그건 게임 개발자가 그 의무를 다하지 않은 것이나 마찬가지다.
아마도 언리얼엔진을 다루며 개발을 하는 동안에 자주 볼 느낌인 Tick 함수인데 프레임 레이트에 따른 Tick함수의 특성을 충분히 고려해서 코드를 작성하도록 습관을 들여야겠다.
참고자료
[UE5] Enhanced Input, C++를 통한 이동 구현 #2
이제 실제로 탱크를 움직여 보도록 하자.
velog.io
'언리얼엔진(UE)' 카테고리의 다른 글
[UE] 액터 생애주기(Actor Life Cycle) (0) | 2025.02.05 |
---|---|
[UE] Lerp (선형 보간, Linear Interpolation) (0) | 2025.02.04 |
[UE] AActor 클래스의 BeginPlay, Tick 함수의 접근 지정자 차이 (0) | 2025.01.31 |
[UE] CDO(Class Default Object) (0) | 2025.01.27 |
[UE] 언리얼 엔진 코딩 컨벤션(Coding Convention) (0) | 2025.01.23 |