일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 패스트캠퍼스후기
- DotsTween
- 환급챌린지
- sha
- Unity Editor
- 가이드
- Custom Package
- unity
- Framework
- Dots
- RSA
- 샘플
- 직장인공부
- 커스텀 패키지
- 최적화
- 직장인자기계발
- 프레임워크
- ui
- 오공완
- 2D Camera
- TextMeshPro
- adfit
- C#
- Job 시스템
- base64
- Tween
- AES
- job
- 패스트캠퍼스
- 암호화
- Today
- Total
EveryDay.DevUp
[TACampus] 6주차 과제 - Unity Animation Optimize 본문
게임 개발에서 3D 캐릭터는 필수적인 요소입니다. 아트팀에서 제작한 3D 캐릭터를 Unity로 가져오기 위해서는 적절한 파일 형식이 필요한데, 이때 가장 널리 사용되는 것이 바로 FBX 포맷입니다.
FBX 파일 형식이란?
FBX는 Autodesk에서 개발한 3D 파일 형식으로, 3D 모델링, 애니메이션, 게임 개발 분야에서 광범위하게 사용되고 있습니다. 특히 게임 개발에서는 아트 파이프라인과 게임 엔진 사이의 다리 역할을 하는 중요한 포맷입니다.
FBX의 주요 특징
다양한 데이터 지원 FBX는 단순한 3D 모델 정보를 넘어 다양한 데이터를 포함할 수 있습니다. 3D 모델의 기하학적 형태는 물론, 텍스처, 재질, 애니메이션, 조명, 카메라 정보까지 모두 하나의 파일에 담을 수 있어 매우 효율적입니다.
뛰어난 호환성 Maya, 3ds Max, Blender와 같은 3D 모델링 소프트웨어부터 Unity, Unreal Engine 같은 게임 엔진까지 대부분의 3D 소프트웨어에서 FBX를 지원합니다. 이러한 호환성 덕분에 서로 다른 툴 간의 데이터 교환이 원활하게 이루어질 수 있습니다.
애니메이션 보존 FBX의 가장 강력한 기능 중 하나는 애니메이션 데이터를 손실 없이 전달할 수 있다는 점입니다. 키프레임 애니메이션, 스켈레톤 애니메이션, 모핑 등의 동적 정보를 모두 보존하여 전달할 수 있습니다.
애니메이션 최적화의 필요성
이번 게시글에서는 FBX의 여러 기능 중에서도 애니메이션 데이터 최적화에 집중하여 설명하고자 합니다.
이해를 돕기 위해 Mixamo에서 무료로 다운로드 가능한 캐릭터와 애니매이션을 설정하여 FBX로 다운로드 한 뒤 Unity에 Import 했습니다.
FBX 파일을 Export하는 과정에서 애니메이션의 모든 키프레임이 저장되는데, 이를 Unity에 Import할 때 Compression을 off로 설정하면 모든 키프레임이 애니메이션 데이터에 그대로 반영되는 것을 확인할 수 있습니다.
Compression을 사용하지 않은 애니매이션 키프레임에는 불필요한 스케일 키, 동일한 값을 가지는 키프레임이 있기 때문에, 애니매이션 데이터를 그대로 사용하면 불필요한 파일 용량과 연산만 증가하는 결과를 가지게 됩니다. 게임 성능과 메모리 사용량을 고려했을 때, 적절한 최적화 과정이 필요합니다.
Unity의 Compression 옵션 사용하기
Unity의 compression 옵션을 변경할 경우 xxxx.fbx.meta에서 compression의 값이 변경 되어 저장되고 compression에 의해 변경되는 키프레임 정보는 ArtifactDB, SourceAssetDB에 저장되는것으로 추정됩니다. 원본 .fbx에는 변동이 없습니다.
Compression에 Keyframe Reduction 사용하기
Unity에서 애니메이션을 임포트할 때 Animation Compression의 Keyframe Reduction 옵션을 활성화하면 애니메이션 커브의 불필요한 키프레임을 제거하여 파일 크기를 줄이고 성능을 향상시킬 수 있습니다.
공식 문서와 기술 블로그 등의 자료를 통해 Keyframe Reduction의 알고리즘을 유추하면 다음과 같습니다.
Unity의 키프레임 단순화 알고리즘
Unity의 Keyframe Reduction 알고리즘은 곡선 기반 에러 허용 방식을 사용합니다
1. 키프레임 간의 보간(Interpolation)을 기준으로 오차(Epsilon) 계산
2. 특정 허용 오차 내에서 기존 키프레임들을 선형 보간 또는 스플라인 보간으로 대체 가능한지 판단
3. 에러가 설정된 임계값 이하일 경우 해당 키프레임 삭제
공식 문서에서 확인할 수 있는 메커니즘
Unity 공식 매뉴얼의 AnimationClip Import Settings에서는 Keyframe Reduction에 대해 다음과 같이 설명하고 있습니다
- Keyframe Reduction: 임포트 시 중복된 키프레임을 제거하는 기능
- Error tolerance 기준:
Rotation: Angle(value, reduced) < RotationError
Position & Scale: (OriginalValue – ReducedValue) > OriginalValue * percentageOfError
즉, 각 키프레임 제거 여부를 보간값과 실제값 간의 오차를 기준으로 판단한다고 공식적으로 명시되어 있습니다.
커뮤니티에서는 Unity와 동일한 알고리즘을 구현한 여러 플러그인들이 존재합니다:
- txtxj/Unity-Animation-Compression-Keyframe-Reducer: "각 키프레임이 앞뒤 키프레임으로 보간 가능한지 판단하여 삭제"
- phi16/ImKeyframeReduction: polynomial fitting 형태로 동일한 원리 구현
이러한 구현 예제들을 통해 Unity 내부의 키프레임 단순화 방식이 "인접 키프레임으로 보간한 값과 원본 값을 비교하여 오차가 적으면 삭제"하는 방식임을 확인할 수 있습니다.
오차 값의 따라 애니매이션의 움직임 (키프레임 삭제에 따른 변화)과 파일 크기가 변동되는 것을 확인할 수 있습니다.
하지만 스케일 키의 경우 동일 값이지만 Keyframe Reduction을 하더라도 처음과 마지막 프레임에 키가 남기 때문에 수동 또는 스크립트 기능을 통해 삭제해줄 필요가 있습니다.
Compression의 Optimal
Unity에서 Animation Compression을 "Optimal"로 설정하면 Unity가 애니메이션의 특성에 따라 가장 효율적인 압축 방식을 자동으로 선택합니다.
Optimal 압축의 작동 원리
Unity 공식 매뉴얼에 따르면, Optimal 옵션은 다음과 같이 정의됩니다:
"Let Unity decide how to compress, either by keyframe reduction or by using dense format. Only for Generic and Humanoid rigs."
즉, Unity가 애니메이션의 구조 및 움직임 특성에 따라 다음 중 하나를 자동으로 선택합니다:
- Keyframe Reduction (키프레임 단순화)
- Keyframe Reduction + Compression (키프레임 단순화 + 압축)
- Dense Format (조밀한 형식)
- 압축 없음 (드물지만 가능)
자동 선택 기준
Unity가 최적의 압축 방식을 판단할 때 고려하는 요소들:
곡선 수: Position, Rotation, Scale 트랙의 개수
키프레임 수: 전체 키프레임의 밀도
오차 범위 설정: Rotation Error, Position Error 등의 허용 오차
보간 방식: 선형 보간 vs 곡선 보간
Precision 요구도: 애니메이션의 정밀도 필요성
스크립팅 API에서의 정의
Unity의 ModelImporterAnimationCompression.Optimal에 대한 공식 정의:
"Perform keyframe reduction and choose the best animation curve representation at runtime to reduce memory footprint (default). Optimal is only available for generic and humanoid rig type."
중요한 제한사항: Optimal 옵션은 Generic과 Humanoid 리그 타입에서만 사용 가능합니다.
Optimal 옵션이 사용 가능한 경우 다음과 같은 과정을 거칩니다:
1. Keyframe Reduction을 수행
2. 클립별로 "streaming curve" vs "dense curve" 중 더 작은 메모리 사용 방식을 선택
3. 런타임에서 최적의 애니메이션 커브 표현 방식을 결정
'TA > TACampus-Com2us' 카테고리의 다른 글
[TACampus] 7주차 과제 - 알파 소팅, 알파테스트, 알파블렌딩 (0) | 2025.07.13 |
---|---|
[TACampus] 5주차 과제 - 빛의 사분면 (0) | 2025.06.22 |
[TACampus] 4주차 과제 - GPU 대역폭과 최적화 방법 (3) | 2025.06.15 |
[TACampus] 3주차 과제 - DLSS란 무엇인가 (3) | 2025.06.07 |
[TACampus] 2주차 과제 - 컬링, 클립핑 그리고 가드밴딩 클립핑 (1) | 2025.06.01 |