1.FTickableGameObject
FTickableGameObject는 언리얼 엔진에서 AActor나 UActorComponent 상속 없이 UObject 또는 일반 C++ 클래스가 전역적으로 Tick 함수를 호출받을 수 있게 하는 인터페이스입니다.
virtual bool IsTickable() const override { return true; }
Unreal Engine에서 BeginPlay(), Tick() 같은 오버라이드 가능한 콜백 함수들이 내부 내용이 비어 있어도 사용하지 않는다면 제거하는 이유는 실제로 성능과 관련이 있습니다.
Tick()은 매 프레임 호출됨
- Tick(float DeltaTime)은 PrimaryActorTick.bCanEverTick = true일 경우, 매 프레임마다 무조건 호출됩니다.
- 내부가 비어 있어도 엔진은 해당 객체가 틱 가능한지 판단하고, Tick 큐에 넣고, 호출하려는 동작을 반복합니다.
- 이런 연산은 수천 개의 액터가 있을 경우, 작은 오버헤드도 누적되면 눈에 띄는 성능 저하로 이어집니다.
Tick 등록 자체가 비용
- bCanEverTick = true 설정 시, 해당 액터는 엔진의 Tick 관리 시스템에 등록됩니다.
- 이 등록 자체가 내부 자료구조(예: TickTaskManager)에 포함되는 의미가 있으므로, 불필요한 틱 등록은 지양해야 합니다.
언리얼 엔진의 ETickableTickType은 FTickableGameObject 인터페이스를 구현하는 객체가 언제, 어떻게 틱(Tick)을 수행할지 정의하는 열거형(Enum)입니다.
enum ETickableTickType
{
Conditional,
Always,
Never,
NewObject,
}
GetTickableTickType은 기본적으로 Always로 설정되어 있으나, 불필요한 틱을 줄이기 위해 Conditional을 사용하는 것이 권장됩니다.
주요 ETickableTickType 옵션
- Always: 객체가 항상 프레임마다 Tick() 함수를 호출합니다.
- Conditional: IsTickable() 함수가 true를 반환할 때만 Tick()이 호출됩니다.
- Never: 틱이 전혀 호출되지 않습니다