Component Update 경량화 전략

게임 내 액터는 다양한 컴포넌트를 통해 구성되며, 이 컴포넌트들은 기본적으로 매 프레임 업데이트를 수행한다.
하지만 모든 컴포넌트가 매 프레임 업데이트될 필요는 없기 때문에, 필요 없는 기능을 비활성화하여 연산 비용을 줄일 수 있다.

USceneComponent 최적화 항목

USceneComponent는 모든 씬에 존재하는 기본 컴포넌트로, Transform 및 Attach 정보를 처리한다.

설정 항목설명
MobilityStatic이면 업데이트 및 이동 연산 없음. 가능하면 Static으로 설정
SetComponentTickEnabled(false)컴포넌트 단위로 Tick 제거
bAutoActivate = false시작 시 불필요한 컴포넌트는 비활성화
bAbsoluteLocation/Rotation/Scaletrue일 경우 계산 부담 증가. 반드시 필요한 경우에만 사용(부모와 분리되어 연산되기때문)
AttachToComponent() 사용 방식EAttachmentRule::KeepWorld는 연산 많음 → KeepRelative 권장(현재의 WorldTransform을 유지하면서 다시 상대값 계산하기때문)
bWantsOnUpdateTransformTransform이 바뀔 때마다 수동 업데이트 받을지 여부. false로 설정 권장

USkeletalMeshComponent 최적화 항목

USkeletalMeshComponent는 애니메이션, 본 정보, 물리, 모프 타겟 등 다양한 연산을 포함하므로 성능 부담이 크다.

설정 항목설명
bTickInEditorEditor 전용 Tick. 게임 런타임엔 false로 유지
MeshComponentUpdateFlagOnlyTickPoseWhenRendered 설정 시 안 보이면 포즈 계산 생략 가능
Visibility Based Anim Tick OptionOnlyTickMontagesWhenNotRendered 등으로 설정하여 최적화
bUpdateAnimationInEditor에디터 상에서 애니메이션 계산 비활성화 가능
bEnableUpdateRateOptimizations애니메이션 업데이트 최적화 기능 사용 여부
bAllowCullDistanceVolumes거리 기반 자동 Cull 허용
LOD 설정낮은 LOD에 단순한 본 구성 적용. 각 LOD마다 본 개수 차등화 가능
MasterPoseComponent여러 캐릭터가 동일 애니메이션 쓸 경우, 마스터-슬레이브 구조로 포즈 공유

SkeletalMesh 업데이트 최적화 예시

  SkeletalMeshComp->MeshComponentUpdateFlag = EMeshComponentUpdateFlag::OnlyTickPoseWhenRendered;
SkeletalMeshComp->VisibilityBasedAnimTickOption = EVisibilityBasedAnimTickOption::OnlyTickMontagesWhenNotRendered;
SkeletalMeshComp->bEnableUpdateRateOptimizations = true;
  

이렇게 설정하면 화면에 안 보이는 캐릭터는 포즈 계산을 생략하고,
애니메이션도 꼭 필요한 몽타주만 Tick을 수행하게 된다.

Master Pose Component 최적화 구조

여러 NPC가 동일한 SkeletalMesh + AnimInstance를 공유할 경우,
하나의 마스터만 포즈를 계산하고 나머지는 이를 복사받게 하면 큰 최적화가 가능하다.

  SlaveMesh->SetMasterPoseComponent(MasterMesh);
  

이 방식은 대규모 군중이나 병사처럼 동일한 애니메이션을 공유할 때 매우 유용하다.