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 조정TickGroupTG_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을 우회할 수도 있음