Unity は、アセットバンドル向けに3つの圧縮オプション(LZMA、LZ4、Uncompressed)をサポートしています。
デフォルトでは、アセットバンドルをビルドしたとき、圧縮されたフォーマットで保存されます。標準的な圧縮フォーマットは、シリアル化されたデータファイルの単一の LZMA ストリームで、使用する前にアセットバンドルを解凍する必要があります。
LZMA 圧縮バンドルを使うと、ダウンロードサイズを最小にできますが、非圧縮と比較すると読み込み時間がはっきりわかるぐらい、解凍が遅くなります。
Unity は、LZ4圧縮もサポートしており、ファイルサイズが大きくなりますがアセットバンドルの使用前に全体のバンドルを解凍するのは必須ではありません。LZ4では “チャンクベース” のアルゴリズムで動作します。したがって、オブジェクトがLZ4圧縮バンドルから読み込まれる場合、そのオブジェクトに対応するチャンクのみが解凍されます。これは動作中に起こり、使用前にバンドル全体を解凍する待ち時間がないことを意味します。LZ4 フォーマットはUnity 5.3で導入され、5.3以前のバージョンでは利用できません。
第3の圧縮オプションは、まったく圧縮しません。非圧縮のバンドルは大きいですが、いったんダウンロードしてしまえば、アクセスするには最速です。
WWW.LoadFromCacheOrDownload 機能をダウンロードし、ディスクにアセットバンドルをキャッシュすると、その後は、大幅に読み込み時間が高速化します。 Unity 5.3以降から、キャッシュされたデータも LZ4 アルゴリズムで圧縮することが可能です。非圧縮バンドルと比較すると、これはスペースを40%~60%節約します。再圧縮がダウンロード中に行われるので、エンドユーザーにほとんど気付かれません。データがソケットから到着すると、Unity は、そのデータを解凍し、LZ4フォーマットで再圧縮を行います。この再圧縮がダウンロードのストリーミング中に実行されるのは、十分なデータ量がダウンロードされるとキャッシュの圧縮がすぐに始まるためで、ダウンロードが終了するまで増分的に継続します。その後、データが必要なときに動作中のチャンクを解凍することでキャッシュされたバンドルからデータを読み出します。
Cache の圧縮は、デフォルトで有効になり、Caching.compressionEnabledプロパティーで制御されます。これは、ディスクにキャッシュされるバンドルに影響を及ぼしメモリに記憶されます。
この表では異なる圧縮タイプと異なる読み込み方法を利用する場合のメモリとパフォーマンスのオーバーヘッドの比較を提供します。
非圧縮 | 圧縮チャンク(LZ4) | 圧縮されたストリーム(LZMA) | |
---|---|---|---|
WWW * | メモリ: 非圧縮バンドルサイズ + (WWW が削除されていない間の非圧縮のバンドルサイズ)。性能: 付加処理なし | メモリ: LZ4HC 圧縮されるバンドルサイズ + (WWW が削除されない間の LZ4HC 圧縮バンドルサイズ)。性能: 付加処理なし | メモリ: LZ4 圧縮バンドルサイズ + (WWW が消去されない間 LZMA 圧縮バンドルサイズ)。 性能: LZMA 解凍 + ダウンロード中の LZ4 圧縮 |
LoadFromCacheOrDownload | メモリ: 余分なメモリは使われない。性能:ディスクから読み出す。 | メモリ: 余分なメモリは使われない。性能:ディスクから読み出す。 | メモリ: 余分なメモリは使われない。性能:ディスクから読み出す。 |
LoadFromMemory (Async) | メモリ: 非圧縮バンドルサイズ、性能: 付加処理なし | メモリ: LZ4HC 圧縮バンドルサイズ、性能: 付加処理なし | メモリ: LZ4 圧縮バンドルサイズ、性能: LZMA 解凍 + LZ4 圧縮 |
LoadFromFile(Async) | メモリ: 余分なメモリは使われない。性能:ディスクから読み出す。 | メモリ: 余分なメモリは使われない。性能:ディスクから読み出す。 | メモリ: LZ4 圧縮バンドルサイズ、性能: ディスクから読み出す + LZMA 解凍 + LZ4 圧縮 |
WebRequest (キャッシュも対応) | メモリ: 非圧縮バンドルサイズ、性能: 付加処理なし [+キャッシュされた場合、ディスクから読み出す]. | メモリ: LZ4HC 圧縮バンドルサイズ、性能: 付加処理なし [+キャッシュされた場合、ディスクから読み出す]. | メモリ: LZ4 圧縮バンドルサイズ、性能: LZMA 解凍 + ダウンロード中の LZ4 の圧縮 [+キャッシュされた場合、ディスクから読み出す] |
* www,WebRequest を使用してバンドルをダウンロードする場合、ソケットからデータを保存する 8x64KB アキュムレータバッファもあります。
したがって、あなたのゲームで低レベル API を使用して読み込む場合、以下のガイドラインを使用してください。
一般的には、常に非同期関数を選択します – それらの関数は、メインスレッドを停止する事なく、ローディングをより効率的にキューに入れるように動作します。あわせて、同期と非同期の関数を同時に呼び出す事は、絶対に避けなくてはなりません – 同時に呼び出すと、メインスレッドの動作に引っかかりが発生する原因になります。
Asset Bundle のコンテナフォーマットは、新たな圧縮タイプをサポートし、将来的な改良の基礎を用意するために変更されました。 Unity 5 では Unity 4 で作成されたバンドルをサポートしていますが、早期のバージョン(2.x、3.x)で作成されたバンドルはサポートしていません。