Significance Manager란

게임에는 수많은 액터, 파티클, 사운드, 애니메이션 객체들이 동시에 존재.

모든 걸 매 프레임 정밀하게 계산하면 게임이 느려지므로, “중요한 애만 제대로 처리하고, 나머진 생략하거나 대충 계산하자” 라는 취지로 Significance Manager가 도입.

Significance Manager는 각 객체에 대해 “얼마나 중요한지"를 실시간으로 판단하고, 그 값을 기반으로 업데이트, 렌더링, 애니메이션 등을 최적화하는 시스템.

작동 원리

단계설명
객체 등록SignificanceManager->RegisterObject()를 통해 객체 등록
평가 함수 제공각 객체마다 중요도 계산 함수(lambda)를 넘김
매 프레임 평가뷰포트 기준으로 중요도(float)를 계산하여 내부 저장
각 시스템에서 활용애니메이션, 사운드 등에서 중요도 값을 직접 가져다 씀

평가 함수

  // AI: 거리 기반 중요도
SigManager->RegisterObject(AI, [](const FTransform& View) {
    return 1.f / FMath::Clamp(FVector::Dist(View.GetLocation(), AI->GetActorLocation()), 1.f, 10000.f);
});

// 파티클: 화면 내 존재 여부
SigManager->RegisterObject(Particle, [](const FTransform& View) {
    return Particle->IsOnScreen() ? 1.f : 0.f;
});
  
  • 각 객체는 자기만의 평가 함수를 가질 수 있음
  • 즉, 중요도를 판단하는 기준이 달라도 됨

중요도 값

  • 함수에서 리턴한 float 값을 SignificanceManager가 그대로 저장
  • 정규화, 클램프, 스케일링은 직접 해야 함

예시:

  // 가까울수록 중요하게 만들기
[](const FTransform& View) {
    float d = FVector::Dist(View.GetLocation(), Actor->GetActorLocation());
    return 1.f / FMath::Clamp(d, 1.f, 10000.f);
}
  

시스템별 활용 예시

시스템동작 방식
애니메이션중요도 낮으면 애니메이션 생략 또는 Pause
사운드중요도 따라 볼륨 줄이거나 음소거
이펙트중요도 낮으면 파티클 스폰 생략
AI중요도 낮으면 Tick 간격 늘리기
  // 애니메이션에서 사용 예
float sig = SignificanceManager->GetSignificance(MyActor);
if (sig < 0.2f)
{
    SkeletalMesh->bPauseAnims = true;
}
  

중요도를 기준으로 처리 강도를 조절할 수 있다

  float sig = SigManager->GetSignificance(Actor);
if (sig > 0.8f)
    UseFullDetail();
else if (sig > 0.3f)
    UseMediumLOD();
else
    SkipUpdate();
  

그룹 태그를 통해 조율 가능

  SigManager->RegisterObject(MyActor, MyFunc, FName("EnemyAI"));
  
  • 등록할 때 FName으로 그룹 태그 지정 가능
  • 이후 동일 그룹끼리 일괄 처리할 때 유용

같이 보면 좋은 시스템

  • Tick Group, LOD System
  • World Partition + Significance, Async Processing