AssetBundles
한마디로 에셋들을 묶은 파일
차례
에셋 번들 빌드
1. 에셋 번들 설정 (번들에 포함시키기)
👉 무조건 이름은 소문자로 변환됨
👉 'None'은 메인 프로젝트와 함께 패키지
👉 '/'로 폴더 생성 가능, 하위로 번들 선택 가능
👉 Remove Unused Names 로 사용하지 않는 번들 지우기 (하나하나 지우는 기능은 없는 듯)
👉 에셋 번들의 완전한 이름 = 번들 이름 + 번들 배리언트
*에셋 번들 배리언트란?
- ex) hd, sd
- 에셋 번들의 종류
- 런타임 시 Variant 지정
- 플랫폼에 따라 맞는 에셋 번들 쉽게 로딩
- 하드웨어 스펙의 차이에 따라 구분 가능
⚠️ 셰이더를 번들에 포함 시킬 때(주의사항) ⚠️
1. 현재 화면과 라이트매핑 설정을 보고 어느 라이트맵 모드를 사용할지 결정
(이 말은 즉슨, 사용할 씬을 열어놓고 포함시켜야한다는 뜻)
2. 수동으로도 설정 가능 (프로젝트 세팅 => 그래픽스 => 셰이더 스트리핑)
⚙️ 빌드 옵션 ⚙️
BuildAssetBundleOptions.DeterministicAssetBundle
저장된 객체 ID의 해쉬를 이용하여 번들 빌드
👉 로드가 느리다는 단점
👉 객체가 많으면 충돌 가능성이 높다
👉 해시 값 보존 (리빌드 시 해시의 변경을 막음 + 해쉬가 중복되면 다운로드X)
에셋 번들 압축
유니티는 기본적으로 LZMA로 에셋을 생성하고 LZ4로 캐싱함
1. LZMA 포맷
모든 에셋을 하나로 묶어서 압축
=> 가장 높은 압축 비율 (다운로드 크기를 최대로 줄여줌)
=> 대신 압축해제가 느려서 로드에 시간이 오래 걸림 (순차 읽기만 지원)
2. LZ4 포맷(권장)
원본 데이터가 같은 크기의 청크로 분할되고 청크는 독립적으로 압축됨
=> chunk-based 알고리즘 사용
=> 압축률이 낮지만 로딩 효율이 좋음
=> 실시간 압축해제를 원한다면 무작위 읽기 부하가 작은 이 방식 사용
3. 비압축
크기는 크지만 다운로드 된 후 접근이 제일 빠름
(LZMA와 반대의 장단점을 가짐)
에셋 번들 내부 구조
두가지가 약간 다른 데이터 파일로 배치
일반 번들
씬 번들
에셋 번들 로드 및 언로드
🔄 로드 🔄
AssetBundle.LoadAsset(이름 식별자)
👉 프로젝트 뷰에 표시되는 이름
👉 원할 경우에는 타입을 인수로 특정 타입만 로드 가능
AssetBundle.LoadAssetAsync (비동기식)
👉 위와 같은 동작
👉 로드 중 메인 스레드 차단 X
👉 큰 에셋을 로드하거나 여러 에셋 동시에 로드할 때 애플리케이션이 일시중지되지 않음
AssteBundle.LoadAllAssets
👉 번들에 포함된 모든 오브젝트가 로드
👉 원할 경우 타입별로 필터링 가능
🔄 언로드 🔄
AssetBundle.Unload(bool isAll)
👉 모든 데이터 언로드할지 아니면 다운로드된 번들에서 압축된 데이터만 언로드할지 불린 파라미터 사용
👉 true로 설정하면 모든 것을 언로드하게 되고 로드된 에셋들이 제거됨
에셋 번들을 위한 에셋 준비 (전략)
논리적 엔티티 그룹화
- 기능적인 부분에 따라 번들 할당
- DLC에 적합
- 엔티티 하나만 변경하고 변경되지 않은 추가 에셋은 다운로드하지 않는 장점
- 이 전략에 가장 중요한 부분은 개발자가 이 에셋이 어디에 쓰이는지 다 파악해야 한다는 점
타입 그룹화
- 오디오 트랙이나 언어 파일과 같은, 타입이 비슷한 에셋을 하나의 에셋 번들에 할당
- ex) windows와 mac의 오디오 압축 설정이 동일한 경우 재사용 가능
- 셰이더 같은 경우 특정 플랫폼에만 해당되는 옵션과 함께 컴파일되는 경향이 있음
=> 그럴 때 mac용 셰이더 번들을 windows에서는 재사용하지 못하게 됨
동시 콘텐츠 그룹화
- 동시에 로드되고 사용될 에셋을 하나로 묶기
- 동시 콘텐츠 그룹화 번들에 에셋 하나에 종속성이 있으면 로드 시간이 크게 증가
✨ 추가 팁 ✨
- 자주 업데이트되는 오브젝트는 변경 빈도가 낮은 오브젝트와 나누어라
- 동시에 로드될 가능성이 큰 오브젝트끼리 그룹화하라
- 오브젝트 그룹이 단순히 같은 오브젝트에 다른 버전이라면 배리언트를 고려하라
에셋 번들 종속성
- 여러 에셋 번들에서 사용되는 에셋 => 공통 에셋
- 공통 에셋은 메모리 리소스와 로딩 시간에 영향
에디터 설정
- 공통 에셋을 자체 에셋 번들에 할당
런타임 로딩
- 로드되는 순서
프리팹이 로드되었지만 Material이 로드되지 않은 경우
문제 해결
에셋 중복
두 개의 서로 다른 오브젝트가 서로 다른 에셋 번들일 때,
서로 공통 종속성 오브젝트에 대한 레퍼런스가 있는 경우 두 에셋 번들에 모두 복사되는 현상
해결 방법
- 종속성 공유하지 않게 하기
- 종속성을 공유하는 두 에셋 번들을 동시에 로드되지 않게 분할
- 모든 종속성 에셋이 자체적인 에셋 번들에 내장되도록 함
=> 종속성 추적해야하고 로드 호출 전에 올바른 에셋 번들이 로드되는지 확인 필요 (복잡성 발생)
그 외
에셋 번들을 알아보던 과정 중에 "어드레서블" 이라는 것을 보게 되었다.
간단히 어드레서블이란 에셋 번들 + 관리 시스템으로 에셋 번들과의 차이점은 저장소로부터 에셋을 가져오는 방식이 다르다는 것이다.
더 자세한 내용은 나중에 다시 알아봐야겠다.
참고 자료 모음
Unity Document 자료
https://docs.unity3d.com/kr/530/Manual/AssetBundlesIntro.html
https://docs.unity3d.com/kr/2021.3/Manual/AssetBundles-Preparing.html
'엔진(Unity, Unreal)' 카테고리의 다른 글
Application.isEditor와 #if UNITY_EDITOR (0) | 2023.11.21 |
---|---|
Plastic SCM (1) | 2023.10.11 |
유니티 Not allowed 버그 (Mesh) (0) | 2023.04.06 |
[1] Unreal 기초 이론 다지기 (Unity와 비교) (0) | 2023.01.21 |
댓글