에셋 번들 빌드(Building AssetBundles)
에셋 번들 내부 구조(Asset Bundle Internal Structure)

에셋 번들 압축(Asset Bundle Compression)

Unity는 에셋 번들에 LZMA, LZ4, 비압축 등의 세 가지 옵션을 제공합니다.

LZMA 포맷(Format)

기본적으로 에셋 번들은 빌드될 때 압축된 포맷으로 저장됩니다. 스탠다드 압축 포맷은 직렬화된 데이터 파일의 단일 LZMA 스트림으로, 사용 전에 전체를 압축해제 해야 합니다.

LZMA로 압축된 번들은 다운로드 크기를 최대한 줄여주는 반면 압축해제가 상대적으로 느려 로드에 시간이 더 걸립니다.

LZ4 포맷(Format)

또한, Unity는 LZ4 압축도 지원하는 데 압축된 파일 크기는 좀 더 크지만 사용 전에 전체 번들을 압축해제할 필요가 없습니다. LZ4는 “청크 기반” 알고리즘이므로 오브젝트가 LZ4 압축 번들에서 로드될 때는 해당 오브젝트의 청크만 압축해제 됩니다. 이것은 온더플라이(on-the-fly) 방식으로 사용 시 전체 번들을 압축해제하기 위해 기다리는 시간이 없다는 의미입니다. LZ4 포맷은 Unity 5.3에서 도입됐으며 이전 버전에서는 사용할 수 없습니다.

압축되지 않은 포맷(Format)

세 번째 압축 옵션은 전혀 압축을 하지 않는 것입니다. 비압축 번들은 크기가 크지만 일단 다운로드 되면 접근이 가장 빠릅니다.

압축된 번들의 캐싱

The WWW.LoadFromCacheOrDownload function downloads and caches asset bundles to disk and thus greatly speeds up loading afterwards. From Unity 5.3 onwards, cached data can also be compressed with the LZ4 algorithm. This saves 40%–60% of space compared to uncompressed bundles. Recompression happens during download and thus is almost unnoticeable by the end users. As data arrives from the socket, Unity will decompress it and recompress it in LZ4 format. This recompression occurs during the download streaming, which means the cache compression begins as soon as enough of the data is downloaded, and continues incrementally until the download is complete. After that, data is read from the cached bundle by decompressing chunks on-the-fly when needed.

캐시 압축은 기본으로 활성화 되며 Caching.compressionEnabled 프로퍼티로 컨트롤합니다. 디스크에 캐시되고 메모리에 저장된 번들에 영향을 미칩니다.

에셋 번들 로드 API 개요

이 테이블은 서로 다른 압축 타입과 로드 메서드를 썼을 때 메모리 및 퍼포먼스 오버헤드를 비교한 것입니다.

Uncompressed Chunk Compressed (LZ4) Stream Compressed (LZMA)
WWW * 메모리: 비압축 번들 크기 + (압축되지 않은 번들 크기, WWW가 실행되는 중에만). 퍼포먼스: 추가 프로세스 없음. 메모리: LZ4HC 압축 번들 크기 + (LZ4HC 압축된 번들 크기, WWW가 실행되는 중에만). 퍼포먼스: 추가 프로세스 없음. Memory: LZ4 compressed bundle size + (while WWW is not disposed, LZMA compressed bundle size). Performance: LZMA decompression + LZ4 compression during download.
LoadFromCacheOrDownload 메모리: 추가 메모리 사용되지 않음. 성능: 디스크에서 읽음. 메모리: 추가 메모리 사용되지 않음. 성능: 디스크에서 읽음. 메모리: 추가 메모리 사용되지 않음. 성능: 디스크에서 읽음.
LoadFromMemory(Async) 메모리: 비압축 번들 크기. 퍼포먼스: 추가 프로세스 없음. 메모리: LZ4HC 압축 번들 크기. 퍼포먼스: 추가 프로세스 없음. Mem: LZ4 compressed bundle size. Perf: LZMA decompression + LZ4 compression.
LoadFromFile(Async) 메모리: 추가 메모리 사용되지 않음. 성능: 디스크에서 읽음. 메모리: 추가 메모리 사용되지 않음. 성능: 디스크에서 읽음. Mem: LZ4 compressed bundle size. Perf: reading from disk + LZMA decompression + LZ4 compression.
WebRequest(캐싱도 지원) 메모리: 비압축 번들 크기. 퍼포먼스: 추가 프로세스 없음 [+캐시되면 디스크에서 읽음]. 메모리: LZ4HC 압축 번들 크기. 퍼포먼스: 추가 프로세스 없음 [+캐시되면 디스크에서 읽음]. Mem: LZ4 compressed bundle size. Perf: LZMA decompression + LZ4 compression during download [+reading from disk if cached].

* WWW, WebRequest를 사용해 번들을 다운로드할 때, 소켓에서 데이터를 저장하는 8x64KB 어큐뮬레이터 버퍼도 있습니다.

따라서 게임에서 저수준의 로딩 API 를 사용할 때 다음 가이드라인을 따릅니다.

  1. 게임에 에셋 번들을 StreamingAssets로 배치 - 번들을 빌드할 때는 BuildAssetBundleOptions.ChunkBasedCompression을, 로드할 때는AssetBundle.LoadFromFileAsync을 사용합니다. 이에 따라 데이터 압축이 가능하며 메모리 오버헤드가 읽기 버퍼와 동일하도록 가장 빠른 로드 퍼포먼스를 경험할 수 있습니다.
  2. 에셋 번들을 DLCs로 다운로드 - 기본 빌드 옵션(LZMA 압축)과 LoadFromCacheOrDownload/WebRequest로 다운로드 및 캐시합니다. 압축비가 최고이며 AssetBundle.LoadFromFile은 추가 로드의 로딩 퍼포먼스가 훌륭합니다.
  3. 암호화된 번들 - BuildAssetBundleOptions.ChunkBasedCompression을 선택하고 로드에 LoadFromMemoryAsync를 사용합니다(LoadFromMemory[Async]를 사용해야 하는 거의 유일한 시나리오입니다).
  4. 커스텀 압축- 빌드에 BuildAssetBundleOptions.Uncompressed 에셋 번들을, 커스텀 압축 알고리즘으로 압축해제된 후 로드하는 데 AssetBundle.LoadFromFileAsync를 사용합니다.

일반적으로 항상 비동기 함수를 선택해야 합니다. 메인 스레드의 기능을 정지시키지 않고 로딩 작업을 효율적으로 대기열에 넣을 수 있습니다. 또한 동기 및 비동기 함수를 동시에 호출하는 것은 메인 스레드에 끊기는 현상이 발생할 수 있으므로 반드시 피해야 합니다.

호환성

에셋 번들 컨테이너 포맷은 새 압축 타입을 지원하고 추가적인 개선의 기초를 마련하기 위해 변경되었습니다. Unity 5는 여전히 Unity 4에서 생성된 번들을 지원하고 있지만 이전 버전(2.x, 3.x)에서 생성된 번들은 지원하지 않습니다.

에셋 번들 빌드(Building AssetBundles)
에셋 번들 내부 구조(Asset Bundle Internal Structure)