On this page
article
Significance Manager
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