URO
개요
언리얼 엔진을 만지다보면 URO(Update Rate Optimization) 옵션에 한 번 당하게 되는 때가 온다.
이 옵션은 애니메이션 최적화에 관련된 옵션인데, 이걸 키느냐 끄느냐에 따라 애니메이션의 동작이 좀 어색하게 보이게될 수 있다.
그런데 이 옵션의 존재 자체를 모르면 URO에 의해 문제가 발생했다는 경우의 수를 생각하지 못할 수 있으므로 한번 조사해두자.
URO(Update Rate Optimization)
URO는 Skeletal Mesh의 애니메이션 업데이트와 관련된 최적화 시스템이다.
애니메이션 시스템은 비용이 큰 편인데, 특히 게임에 등장하는 캐릭터 수가 많을수록 전체 퍼포먼스에 부담을 준다.
URO는 그 중 일부 캐릭터(특히 카메라에서 멀리 떨어져 보이지 않는 캐릭터)의 애니메이션 연산을 줄이거나 생략해서 성능을 향상시키는 데 목적이 있다.
원리
기본적으로 SkeletalMeshComponent는 매 프레임마다 다음 작업을 한다:
현재 상태(속도, 방향 등)를 기반으로 애니메이션 블렌딩
애니메이션 그래프 실행 (AnimBlueprint)
최종적으로 본들의 로컬 트랜스폼 계산
본 트랜스폼을 스킨 메시로 적용해서 화면에 렌더링
이 과정이 모든 캐릭터에 대해 매 프레임 수행되면 부하가 크다.
그래서 URO는 다음 방식으로 이걸 줄인다:
최적화 방식 | 설명 |
---|---|
애니메이션 프레임 스킵 | 일부 프레임을 생략하고 이전 결과를 재사용 |
애니메이션 블렌딩 생략 | Pose 계산 없이 이전 Pose를 그대로 사용 |
렌더링 안 되는 경우 완전 생략 | 카메라 밖이면 아예 업데이트를 수행하지 않음 |
Fixed update rate 적용 | 틱 프레임 수를 줄여 일정 주기로만 업데이트하여 연산 부담을 완화 |
핵심 변수들
// URO 활성화 여부
bool bEnableUpdateRateOptimizations;
// 화면에 보일 때만 업데이트
bool bUpdateOnlyIfRendered;
// 틱 정책 (항상 틱할지, 몽타주만 틱할지 등)
EMeshComponentUpdateFlag MeshComponentUpdateFlag;
// 강제로 Reference Pose만 보여줄지
bool bForceRefPoseOnly;
UpdateRateParameters 구조체
언리얼 내부적으로는 FUpdateRateParameters라는 구조체를 캐릭터별로 가지고 있다. 이 구조체는 각 캐릭터에 대해 다음 정보를 관리한다:
얼마나 자주 업데이트할지 (UpdateRate)
얼마나 자주 평가할지 (EvaluationRate)
다음 업데이트까지 남은 프레임 수
프레임 스킵 여부
이건 엔진에서 자동으로 관리되지만, 코드나 콘솔 명령으로 값을 추적하거나 강제로 지정할 수 있다.
유의 사항
- URO를 켜두면 멀리 있는 캐릭터는 움직임이 뚝뚝 끊기듯이 보일 수 있다.
- AI가 제어하는 캐릭터에게도 영향을 미치므로, **정확한 타이밍 계산이 필요한 행동(예: 애니메이션 노티파이 기반 타격)**에는 유의해야 한다.