Unity AssetBundle

vvhustle's coding note·2022년 11월 22일
0

유니티에서의 에셋 번들이란 프로젝트 내의 프리팹, 이미지 아틀라스, 사운드 등 스크립트를 제외한 거의 대부분의 리소스들을 묶을 수 있는 파일 단위입니다.

유니티는 Asset Labels을 제공하여 name 단위로 번들을 설정할 수 있고 Variant 옵션을 통해 타겟에 따라 다르게 보여줄 수 있습니다.

에셋번들의 구조는 header와 data segment로 나누어 집니다.
헤더에는 에셋번들의 식별 정보인 id와 인덱스 정보를 매핑한 lookup table로 구성되고 데이터 세그먼트에는 여러 에셋 정보가 담겨있다고 합니다.

압축 방식
LZMA : 에셋을 통으로 압축. (뭔가 당연하게도 비효울적?)
LZ4(권장) : 에셋을 chunk 단위로 나누어 압축.

에셋 번들을 하고 사용하는 과정은 아래와 같습니다.
1. 에셋 번들 name 설정 등을 통해 번들로 묶는다.
2. 묶인 에셋을 빌드한다.
3. 에셋을 S3 등의 외부 저장소에 업로드한다.
4. 어플리케이션 런타임 후 필요 시에 UnityWebRequest 클래스를 통해 다운 및 로드한다.

번들링을 통해 초기 어플리케이션의 용량을 낮출 수도 높일 수도 있습니다.
에셋 번들은 너무 많이 만들면 빌드 비용이나 다운로드 비용이 많이 들고 너무 적게 만들면 런타임 메모리 비용이 많이 들기 때문에 적절한 번들링이 중요합니다.
또한 용량에 따라 유저 체감 및 로딩 시간이 달라질 수 있고 slotoday에서는 아래와 같이
필수로 로컬에 존재해야 하는 에셋인 default assets, 필요에 따라 로컬 혹은 다운로드할 수 있는 영역인 local Assets, Assets으로 구분하고 있습니다.

실제 서비스 도중 character.png가 잘못 되었을 경우에는 파일 수정 후 별도의 어플리케이션 배포 없이 에셋 번들만 빌드하여 업로드하는 장점도 있습니다.
각 슬롯의 경우 DLC처럼 필요한 경우에 다운 받고 로드하고 필요 없을 경우 unload하여 메모리가 부족 문제를 예방할 수 있습니다.
만약, a 번들의 오브젝트가 b 번들의 오브젝트를 참조할 경우 의존성을 가지게 되는데 각 에셋 번들의 manifest와 Andriod.manifest는 이들의 관계 정보를 가지고 있습니다.
따라서 의존성이 없게 번들링하는 것도 중요합니다.

LOBBY → GAME으로 씬이 전환 될 때 유니티에서는 Resources.UnLoadUnUsedAsset을 호출하는데 이때 호출 순서가
1.GAME LOAD
2.LOBBY RELEASE(DESTROY)
이기 때문에 특정 시점에서는 GAME과 LOBBY의 리소스들이 모두 메모리에 올라와 씬을 전환할 경우 메모리 문제가 발생할 수 있습니다.
때문에 중간에 가벼운 loading 씬을 호출해 리소스들이 메모리에 올라오는 시간을 확보합니다.

유니티의 에셋 번들 다운 라이브러리는 다운로드 요청 뿐만 아니라 디스크 캐시(Unity.Caching)에 에셋 번들의 해시 값을 저장합니다.
원격지 파일과의 해시(hash128)의 비교를 통해 변경점이 없을 경우에는 불필요하게 요청하지 않도록 합니다.
이것이 Android.manifest 뿐만 아니라 각 에셋 번들이 .manifest를 가지고 있는 이유입니다.

캐시되어 있는 경우 리소스는 아래와 같이 플랫폼 별로
#if UNITY_ANDROID
path = "jar:file//" + Application.dataPath + "!/assets";
#elif UNITY_IOS
path = Application.dataPath + "/Raw";
#else
path = Application.dataPath + "/StreamingAssets";
#endif
StreamingAssets을 가지고 있습니다.

에셋 번들 브라우저 툴을 import하면 에디터 내의 전체 에셋 번들의 구성을 확인하는데 좋습니다.
https://docs.unity3d.com/Manual/AssetBundles-Browser.html?_gl=1*rpp7nl*_gcl_aw*R0NMLjE2MzE3MDM3OTYuQ2owS0NRandzNGFLQmhEUEFSSXNBSVdIMEpYWG9DS1lxd01EOFQtVmhyR21MZzIxdEJOX2w2d3AyTTVvaWswdlNPYnVjenRiekpMV2s2WWFBbkdYRUFMd193Y0I.&_ga=2.249988614.1082552326.1631696685-143853720.1626054868

참고
https://blog.unity.com/kr/technology/learn-to-save-memory-usage-by-improving-the-way-you-use-assetbundles
https://www.inven.co.kr/webzine/news/?news=198839
https://coderzero.tistory.com/entry/%EC%9C%A0%EB%8B%88%ED%8B%B0-%EB%A7%A4%EB%89%B4%EC%96%BC-%EC%9C%A0%EB%8B%88%ED%8B%B0-%EB%8D%B0%EC%9D%B4%ED%84%B0-%ED%8C%A8%EC%8A%A4

0개의 댓글