Asset Bundle Compression

반응형

유니티의 에셋번들 압축

유니티는 세가지 에셋번들 압축 옵션을 제공한다 : LZMA, LZ4, 그리고 비압축(UnCompressed)

LZMA Format

기본, 에셋번들을 만들 때 압축포맷으로 만들어 진다.

표준 압축 포맷은 직렬화된 데이터 파일들의 단일 LZMA 스트림이며,

사용하기 전에 전체를 압축해제 해야 한다.

이 방식은 다운로드 용량이 가장 작지만, 상대적으로 느린 압축 해제로 인해,

로드 시간이 더 많이 걸린다.


LZ4 Format

이 방식은 LZMA와는 다르게 큰 용량의 압축파일이 만들지만,

대신 사용하기 전에 전체를 압축해제 할 필요가 없다.

이 방식은 "chunk-based"알고리즘으로, 압축된 번들에서

오브젝트를 로드할 때, 해당 오브젝트의 해당 청크만 압축을 해제한다.

이는 on-the-fly(빈번하게 읽고 쓰기가 발생)을 발생시키며, 

번들을 사용하기 전에 전체를 압축 해제하기 위한 대기타임이 없다는 것을 의미한다.

이 방식은 5.3에서 소개되었고 이전 버전에서는 지원되지 않았다.


Uncompressed Format

세번째 옵션은 전혀 압축하지 않는다.

비압축이므로 의 양은 가장 크지만, 다운로드는 가장 빠르다.


Cashing of Compressed Bundles

WWW.LoadFromCacheOrDownload 함수는 에셋번들을 디스크에 다운로드 하고 캐시하여 후에 무척 빠른 로딩이 가능하다.

5.3이후로, 캐시된 데이터는 LZ4알고리즘으로 압축할 수 있다.

이는 비압축 번들과 비교했을 때 40~60퍼센트의 공간절약이 된다.

재압축은 다운로드 중에 발생하므로 사용자가 거의 알아차릴 수 없다.

소켓으로부터 데이터가 도착하면, 유니티가 그것을 압축해제하고 다시 LZ4로 재압축 한다.

재압축은 다운로드 스트리밍 동안에 발생하며, 이는 충분한 양의 데이터가 다운로드 되자마자

캐시압축이 시작되고 다운로드가 완료될 때까지 점진적으로 계속된다는 것을 의미한다.

그 이후에, 필요할 때 마다 청크를 압축 해제하여 캐시된 번들에서 데이터를 읽는다.

캐시압축은 기본값으로 켜져있고 Caching.compressionEnabled 옵션으로 컨트롤된다.

이는 번들이 디스크에 캐시되고 메모리에 저장되는 것에 영향을 끼친다.


AssetBundle load API overview

아래 표는 압축별, 로딩방법별 메모리의 압축과 오버헤드 퍼포먼스를 정리한 것이다.

 

 Uncompressed

Chunk Compressed(LZ4) 

Stream Compressed(LZMA

 WWW

비압축된 번들 사이즈 + (WWW가 disposed 되지 않는 동안 비압축 번들 사이즈)

추가 처리 없음

LZ4HC 압축된 번들 사이즈 +(WWW가 disposed 되지 않는 동안 LZ4HC 압축된 번들 사이즈).

추가 처리 없음

LZ4 압축된 번들 사이즈 + (WWW가 disposed 되지 않는 동안 LZMA 압축된 번들 사이즈)

다운로드 하는 동안 LZMA 압축해제 + LZ4 압축

 LoadFromCacheOrDownload

추가 메모리 사용하지 않음 

디스크에서 읽음

추가 메모리 사용하지 않음

디스크에서 읽음 

추가 메모리 사용하지 않음

디스크에서 읽음

 LoadFromMemory(Async)

비압축 번들 사이즈.

추가 처리 없음

LZ4HC 압축 번들 사이즈

추가 처리 없음 

LZ4 압축 번들 사이즈

LZMA 압축해제 + LZ4 압축 

LoadFromFile(Async) 

 추가 메모리 사용하지 않음

디스크에서 읽음

 추가 메모리 사용하지 않음

디스크에서 읽음

 LZ4 압축 번들 사이즈

디스크에서 읽음 + LZMA 압축해제 + LZ4 압축

WebRequest(also supports caching) 

 비압축 번들 사이즈.

추가 처리 없음(캐시되어 있다면 디스크에서 읽음)

LZ4HC 압축된 번들 사이즈

추가 처리 없음(캐시되어 있다면 디스크에서 읽음) 

 LZ4 압축된 번들 사이즈.

LZMA 압축해제 + 다운로드 동안 LZ4압축(캐시되어 있다면 디스크에서 읽음)


WWW, WebRequest를 사용해서 번들을 다운로드할 때, 소켓의 데이터를 저장하는 8x64KB 누산기 버퍼가 있다.

따라서, 게임에서 low level 로딩 api를 사용할 때 아래의 가이드 라인을 사용해라.

1. StreamingAssets으로 게임의 에셋번들을 배포 - 번들을 빌드할 때 BuildAssetBundleOptions.ChunkBasedCompression을 

   사용하고 로드할 때는 AssetBundle.LoadFromFileAsync를 사용해라.

   이는 읽기 버퍼와 동일한 메모리 오버헤드로 데이터 압축과 가능한한 가장 빠른 로딩 성능을 얻을 수 있다.

2. DLC로 에셋번들을 다운로딩 - 다운로드와 캐시를 위해 기본 번들 옵션(LZMA 압축)과

   LoadFromCacheOrDownload/WebRequest을 사용해라.

   여기에서 최고의 압축 비율과 추가 로드에 AssetBundle.LoadFromFIle 로딩 성능을 낼 수 있다.

3. 암호화된 번들 -  BuildAssetBundleOptions.ChunkBasedCompressiondmf tjsxorgofk.

   ChunkBasedCompression과 로딩을 위해 LoadFromMemoryAsync을 사용해라.

   (LoadFromMemory[Async]를 사용하는 거의 거의 유일한 방법이다.)

4. 자체 압축 - 빌드는 BuildAssetBundleOptions.UncompressedAssetBundle로 하고

   자체 압축 알고리즘으로 압축 해제 후에 번들 로드는 AssetBundle.LoadFromFileAsync 사용해라.


일반적으로 항상 비동기 함수를 사용해야 하는데, 이 함수들은 메인 스레드를 멈추지 않고 

로딩작업을 보다 효율적으로 수행한다.

그리고 비동기와 동기를 동시에 호출하는 것은 피해야 하는데 이는 메인스레드에 렉을 유발한다.


Compatibility

새로운 압축 타입을 지원과 향상된 기반을 제공하기 위해 에셋번들 컨테이너 포맷이 변경되다.

유니티 5는 아직 유니티4에서 번들을 만드는 것을 지원하지만 그 이전 버전(2.x 나 3.x)은 지원하지 않는다.


Reference Link

- Asset Bundle Compression

- WWW.LoadFromCacheOrDownload

-

TAGS.

Comments