개요

언리얼 엔진을 만지다보면 URO(Update Rate Optimization) 옵션에 한 번 당하게 되는 때가 온다.

이 옵션은 애니메이션 최적화에 관련된 옵션인데, 이걸 키느냐 끄느냐에 따라 애니메이션의 동작이 좀 어색하게 보이게될 수 있다.

그런데 이 옵션의 존재 자체를 모르면 URO에 의해 문제가 발생했다는 경우의 수를 생각하지 못할 수 있으므로 한번 조사해두자.

URO(Update Rate Optimization)

URO는 Skeletal Mesh의 애니메이션 업데이트와 관련된 최적화 시스템이다.

애니메이션 시스템은 비용이 큰 편인데, 특히 게임에 등장하는 캐릭터 수가 많을수록 전체 퍼포먼스에 부담을 준다.

URO는 그 중 일부 캐릭터(특히 카메라에서 멀리 떨어져 보이지 않는 캐릭터)의 애니메이션 연산을 줄이거나 생략해서 성능을 향상시키는 데 목적이 있다.

원리

기본적으로 SkeletalMeshComponent는 매 프레임마다 다음 작업을 한다:

  1. 현재 상태(속도, 방향 등)를 기반으로 애니메이션 블렌딩

  2. 애니메이션 그래프 실행 (AnimBlueprint)

  3. 최종적으로 본들의 로컬 트랜스폼 계산

  4. 본 트랜스폼을 스킨 메시로 적용해서 화면에 렌더링

이 과정이 모든 캐릭터에 대해 매 프레임 수행되면 부하가 크다.

그래서 URO는 다음 방식으로 이걸 줄인다:

최적화 방식설명
애니메이션 프레임 스킵일부 프레임을 생략하고 이전 결과를 재사용
애니메이션 블렌딩 생략Pose 계산 없이 이전 Pose를 그대로 사용
렌더링 안 되는 경우 완전 생략카메라 밖이면 아예 업데이트를 수행하지 않음
Fixed update rate 적용틱 프레임 수를 줄여 일정 주기로만 업데이트하여 연산 부담을 완화

핵심 변수들

  // URO 활성화 여부
bool bEnableUpdateRateOptimizations;

// 화면에 보일 때만 업데이트
bool bUpdateOnlyIfRendered;

// 틱 정책 (항상 틱할지, 몽타주만 틱할지 등)
EMeshComponentUpdateFlag MeshComponentUpdateFlag;

// 강제로 Reference Pose만 보여줄지
bool bForceRefPoseOnly;
  

UpdateRateParameters 구조체

언리얼 내부적으로는 FUpdateRateParameters라는 구조체를 캐릭터별로 가지고 있다. 이 구조체는 각 캐릭터에 대해 다음 정보를 관리한다:

  • 얼마나 자주 업데이트할지 (UpdateRate)

  • 얼마나 자주 평가할지 (EvaluationRate)

  • 다음 업데이트까지 남은 프레임 수

  • 프레임 스킵 여부

이건 엔진에서 자동으로 관리되지만, 코드나 콘솔 명령으로 값을 추적하거나 강제로 지정할 수 있다.

유의 사항

  • URO를 켜두면 멀리 있는 캐릭터는 움직임이 뚝뚝 끊기듯이 보일 수 있다.
  • AI가 제어하는 캐릭터에게도 영향을 미치므로, **정확한 타이밍 계산이 필요한 행동(예: 애니메이션 노티파이 기반 타격)**에는 유의해야 한다.