Unity는 에셋 번들에 LZMA, LZ4, 비압축 등의 세 가지 옵션을 제공합니다.
기본적으로 에셋 번들은 빌드될 때 압축된 포맷으로 저장됩니다. 스탠다드 압축 포맷은 직렬화된 데이터 파일의 단일 LZMA 스트림으로, 사용 전에 전체를 압축해제 해야 합니다.
LZMA로 압축된 번들은 다운로드 크기를 최대한 줄여주는 반면 압축해제가 상대적으로 느려 로드에 시간이 더 걸립니다.
Unity also supports LZ4 compression, which results in larger compressed file sizes, but does not require the entire bundle to be decompressed before use. LZ4 is a “chunk-based” algorithm, and therefore when objects are loaded from an LZ4-compressed bundle, only the corresponding chunks for that object are decompressed. This occurs on-the-fly, meaning there are no wait times for the entire bundle to be decompressed before use. The LZ4 Format was introduced in Unity 5.3 and was unavailable in prior versions.
세 번째 압축 옵션은 전혀 압축을 하지 않는 것입니다. 비압축 번들은 크기가 크지만 일단 다운로드 되면 접근이 가장 빠릅니다.
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 프로퍼티로 컨트롤합니다. 디스크에 캐시되고 메모리에 저장된 번들에 영향을 미칩니다.
이 테이블은 서로 다른 압축 타입과 로드 메서드를 썼을 때 메모리 및 퍼포먼스 오버헤드를 비교한 것입니다.
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 를 사용할 때 다음 가이드라인을 따릅니다.
일반적으로 항상 비동기 함수를 선택해야 합니다. 메인 스레드의 기능을 정지시키지 않고 로딩 작업을 효율적으로 대기열에 넣을 수 있습니다. 또한 동기 및 비동기 함수를 동시에 호출하는 것은 메인 스레드에 끊기는 현상이 발생할 수 있으므로 반드시 피해야 합니다.
에셋 번들 컨테이너 포맷은 새 압축 타입을 지원하고 추가적인 개선의 기초를 마련하기 위해 변경되었습니다. Unity 5는 여전히 Unity 4에서 생성된 번들을 지원하고 있지만 이전 버전(2.x, 3.x)에서 생성된 번들은 지원하지 않습니다.