Unity は、アセットバンドル向けに3つの圧縮オプション(LZMA、LZ4、Uncompressed)をサポートしています。
デフォルトでは、アセットバンドルをビルドしたとき、圧縮されたフォーマットで保存されます。標準的な圧縮フォーマットは、シリアル化されたデータファイルの単一の LZMA ストリームで、使用する前にアセットバンドルを解凍する必要があります。
LZMA 圧縮バンドルを使うと、ダウンロードサイズを最小にできますが、非圧縮と比較すると読み込み時間がはっきりわかるぐらい、解凍が遅くなります。
Unity は、LZ4圧縮もサポートしており、ファイルサイズが大きくなりますがアセットバンドルの使用前に全体のバンドルを解凍するのは必須ではありません。LZ4では “チャンクベース” のアルゴリズムで動作します。したがって、オブジェクトがLZ4圧縮バンドルから読み込まれる場合、そのオブジェクトに対応するチャンクのみが解凍されます。これは動作中に起こり、使用前にバンドル全体を解凍する待ち時間がないことを意味します。LZ4 フォーマットはUnity 5.3で導入され、5.3以前のバージョンでは利用できません。
第3の圧縮オプションは、まったく圧縮しません。非圧縮のバンドルは大きいですが、いったんダウンロードしてしまえば、アクセスするには最速です。
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.
Cache の圧縮は、デフォルトで有効になり、Caching.compressionEnabledプロパティーで制御されます。これは、ディスクにキャッシュされるバンドルに影響を及ぼしメモリに記憶されます。
この表では異なる圧縮タイプと異なる読み込み方法を利用する場合のメモリとパフォーマンスのオーバーヘッドの比較を提供します。
非圧縮 | 圧縮チャンク(LZ4) | 圧縮されたストリーム(LZMA) | |
---|---|---|---|
WWW * | メモリ: 非圧縮バンドルサイズ + (WWW が削除されていない間の非圧縮のバンドルサイズ)。性能: 付加処理なし | メモリ: LZ4HC 圧縮されるバンドルサイズ + (WWW が削除されない間の LZ4HC 圧縮バンドルサイズ)。性能: 付加処理なし | 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 を使用して読み込む場合、以下のガイドラインを使用してください。
一般的には、常に非同期関数を選択します – それらの関数は、メインスレッドを停止する事なく、ローディングをより効率的にキューに入れるように動作します。あわせて、同期と非同期の関数を同時に呼び出す事は、絶対に避けなくてはなりません – 同時に呼び出すと、メインスレッドの動作に引っかかりが発生する原因になります。
Asset Bundle のコンテナフォーマットは、新たな圧縮タイプをサポートし、将来的な改良の基礎を用意するために変更されました。 Unity 5 では Unity 4 で作成されたバンドルをサポートしていますが、早期のバージョン(2.x、3.x)で作成されたバンドルはサポートしていません。