On this page
article
Tick Optimization
Tick Optimization 전략
Tick은 Unreal Engine에서 매 프레임마다 호출되는 함수로, 캐릭터의 움직임, AI 동작, 애니메이션 업데이트 등 다양한 시스템이 여기에 의존한다.
하지만 모든 Actor나 Component가 매 프레임 Tick을 수행할 필요는 없기 때문에, 효율적인 Tick 최적화는 성능 확보에 매우 중요하다.
Tick의 기본 구조
- Actor나 Component는
PrimaryActorTick.bCanEverTick = true
설정 시 Tick에 참여할 수 있다. - 매 프레임마다
Tick(float DeltaSeconds)
가 호출된다. - Tick은
TickGroup
설정에 따라 실행 시점이 다를 수 있다.
최적화 전략 요약
전략 | 설명 |
---|---|
Tick 사용 자체를 막기 | bCanEverTick = false 또는 SetActorTickEnabled(false) 로 완전히 비활성화 |
조건부 Tick 수행 | 특정 조건일 때만 Tick 수행 (if (!bShouldTick) return; ) |
Tick 간격 늘리기 | PrimaryActorTick.TickInterval 을 설정하여 매 프레임이 아닌 일정 간격마다 Tick 실행 |
TickGroup 조정 | TickGroup 을 TG_PostPhysics 등 후순위로 밀어 부담 분산 |
외부에서 호출 | Tick 대신 외부 Actor나 Manager가 직접 필요한 순간에만 Update 함수 호출 |
Force Disabled 상태 | CanEverTick = false 로 설정하면 엔진이 자체적으로 관리 리스트에서 제거 |
Tick 완전 비활성화
Actor 또는 Component 단위로 아예 Tick을 막을 수 있다.
PrimaryActorTick.bCanEverTick = false;
SetActorTickEnabled(false);
bCanEverTick
: Actor가 Tick 가능 여부를 엔진에 알리는 초기 설정SetActorTickEnabled(false)
: 런타임에서 Tick 활성/비활성 토글
Tick 간격 조정
PrimaryActorTick.TickInterval = 0.2f; // 0.2초 간격으로 Tick
Tick을 매 프레임 실행하지 않아도 되는 경우, 간격을 늘려 성능을 절약할 수 있다.
AI, 파티클 제어, 거리 기반 감시 등에 적절하다.
조건부 Tick 수행
Tick은 가능하되, 내부 조건을 만족할 때만 동작하도록 구성할 수 있다.
void AMyActor::Tick(float DeltaTime)
{
if (!bShouldUpdate)
return;
// 필요한 작업만 수행
}
외부에서 직접 호출하는 방식
Tick 대신, 상위 시스템이나 GameMode 등에서 직접 Actor의 Update를 호출하는 방식도 있다.
이 경우 Tick은 아예 끄고, 일정 조건에서만 연산을 수행할 수 있다.
// Actor 쪽에서는 Tick 비활성화
PrimaryActorTick.bCanEverTick = false;
// GameManager에서 일정 주기마다 직접 호출
void AGameManager::UpdateActors()
{
for (AMyActor* Actor : ManagedActors)
{
if (ShouldUpdate(Actor))
Actor->UpdateLogic(DeltaTime);
}
}
Significance와 연동
Significance Manager와 연동하면, 중요도에 따라 Tick 활성 여부를 자동으로 조절할 수 있다.
float Sig = SignificanceManager->GetSignificance(MyActor);
SetActorTickEnabled(Sig > 0.5f);
TickGroup 조정
Tick이 전체 프레임에서 어느 타이밍에 실행될지 결정하는 설정이다. 예를 들어,
PrimaryActorTick.TickGroup = TG_PostPhysics;
으로 설정하면 물리 연산 이후에 실행되어 부담을 줄일 수 있다.
Editor 상에서 Tick 제거
Editor용 툴, 시네마틱 Actor 등은 WITH_EDITOR
조건문을 이용하거나 IsTemplate()
체크 후 Tick을 제거할 수 있다.
if (HasAnyFlags(RF_ClassDefaultObject))
{
PrimaryActorTick.bCanEverTick = false;
}
정리
항목 | 요약 |
---|---|
Tick은 성능 부담이 크므로 최소화가 필요함 | |
비활성화, 조건부 수행, 간격 조정 등의 전략이 존재함 | |
Significance, TickGroup과 연계 시 더 효율적임 | |
외부 호출 방식으로 완전히 Tick을 우회할 수도 있음 |