애셋번들 기초 (AssetBundle Fundamentals) 1 – 번역
애셋번들 기초 (AssetBundle fundamentals) 1
– 원문 링크 –
이번 장(Chapter)은 유니티5에서 애셋(Asset), Resources 시스템 그리고 리소스 관리에 대한 네번째 시리즈입니다.
이번 장에서는 애셋번들(AssetBundle)을 살펴봅니다. 애셋번들이 빌드되는 시스템과 애셋번들과 상호작용하는데 사용되는 핵심 API를 소개합니다.
특히 애셋번들의 로드 및 해제에 대한 내용을 설명하고, 애셋번들로부터 특정 애셋과 오브젝트를 로드 및 해제하는 것에 관한 내용도 설명합니다.
애셋번들 사용법에 대한 다양한 사례 및 모범사례에 대한 내용은 다음 장을 참고하시기 바랍니다.
3.1 개요 (Overview)
애셋번들 시스템은 유니티가 해제할수 있는 형태의 압축 포맷으로, 하나 이상의 파일을 저장하는 방법을 제공합니다.
이 시스템의 목적은 유니티의 직렬화(serialization)시스템과 호환되는 데이터전달 방법을 제공하는 것입니다.
애셋번들은 비 코드(non-code)타입의 콘텐츠의 전달 및 업데이트를 위해서 제공되는 유니티의 기본 툴입니다.
이를 통해서 개발자가 애셋의 크기를 줄이고, 런타임 메모리의 부담을 최소화하며, 최종 사용자의 장치에 최적화된 타입의 콘텐츠를 선택적으로 로드할 수있는 기능을 제공합니다.
모바일 플랫폼을 타겟으로 하는 프로젝트를 성공적으로 진행하는데 애셋번들의 동작방식을 이해하는 것이 필수입니다.
3.2 애셋번들 안에는 뭐가 들었나요? (What’s in an AssetBundle?)
애셋번들은 두 부분으로 구성되어 있습니다: 하나는 헤더(header)이고, 다른 하나는 세그먼트(segment)입니다.
애셋번들을 빌드할 때 유니티는 헤더(header)를 생성합니다.
헤더에는 애셋번들의 식별자, 애셋번들이 압축된 상태인지 압축이 해제된 상태인지를 알 수 있는 정보, 그리고 매니페스터(manifest)와 같은 애셋번들에 대한 정보가 포함되어 있습니다.
매니페스트(manifest)는 오브젝트의 이름이 키(key)로 저장되어있는 검색 테이블(lookup table)입니다.
테이블의 각 엔트리(entry)는 애셋번들의 데이터 세그먼트(segment)에서 해당 오브젝트의 위치를 찾을 수 있는 바이브 인덱스를 제공합니다.
대부분의 플랫폼에서, 이 검색 테이블은 STL std::multimap으로 구현되어 있습니다. 플랫폼 별로 STL을 구현에 사용되는 알고리즘은 다양하지만, 대부분 균형 검색 트리(balanced search tree)를 응용한 알고리즘입니다.
Windows와 OSX계열(iOS포함)플랫폼은 레드-블랙 트리(red-black tres)를 사용합니다. 따라서, 애셋번들 내의 애셋(Asset)의 수가 증가하면, 매니페스트를 생성하는데 필요한 시간이 선형적으로 증가합니다.
데이터 세그먼트(data segment)에는, 애셋번들 내의 애셋을 직렬화하여 생성한 원본 데이터(가공하지 않은 데이터)가 포함됩니다.
데이터 세그먼트가 압축되면, 직렬화된 바이트 모음에 LZMA압축 알고리즘이 적용됩니다. 즉, 모든 애셋이 직렬화된 다음, 전체 바이트 배열이 압축됩니다.
유니티 5.3 이전에는, 애셋번들 안에서 오브젝트를 개별적으로 압축할 수 없었습니다.
결과적으로 유니티 5.3 이전의 버전에서는, 압축된 애셋번들에서 하나 이상의 오브젝트를 읽으려면, 유니티는 전체 애셋번들의 압축을 해제해야만 했습니다.
일반적으로, 유니티는 동일한 애셋번들의 후속 로딩 요청에 대한 성능을 개선시키기 위해서 압축을 해제한 상태의 애셋번들 복사본을 캐시(cache)에 저장합니다.
유니티 5.3에서 LZ4 압축 옵션을 추가했습니다.
LZ4 압축 옵션으로 빌드된 애셋번들은, 애셋번들 내의 애셋을 개별적으로 압축하여, 유니티가 이렇게 압축된 애셋번들을 디스크에 저장할 수 있도록합니다.
또한 LZ4 압축 옵션으로 빌드된 애셋번들은, 애셋번들 전체를 압출 해제할 필요없이, 개별 오브젝트의 압축을 해제할 수 있는 기능을 제공합니다.
3.3 애셋번들 관리자 (The AssetBundle Manager)
유니티는 Bitbucket에서 애셋번들 관리자(AssetBundle Manager)의 참조 구현(Reference implementation, 샘플 구현)을 개발하고 관리합니다.
애셋번들 관리자는 이번 장에서 설명하는 여러가지 개념과 API를 사용하며, 리소스 관리를 위해서 애셋번들을 도입해야하는 프로젝트에 유용한 출발점을 제공합니다.
주목할만한 기능으로 “시뮬레이션 모드”가 있습니다.
유니티 에디터가 활성화되면, 이 시뮬레이션 모드가 애셋번들에 연결된 애셋에 대한 요청을, 유니티 프로젝트의 Assets 폴더 내의 원본 애셋으로, 곧바로 전달(redirect)합니다.
이를 통해서, 개발자는 애셋번들을 다시 빌드할 필요없이 프로젝트 작업을 할 수 있게됩니다.
애셋번들 관리자는 오픈소스 프로젝트로 운영되며, 여기(https://bitbucket.org/Unity-Technologies/assetbundledemo)에서 프로젝트를 찾을 수 있습니다.
내용 끝까지 읽어주셔서 감사합니다.
배너 클릭은 저에게 많은 힘이 됩니다.
감사합니다 🙂