アセットバンドルのビルド
アセットバンドルの内部構造

アセットバンドルの圧縮

Unity は、アセットバンドル向けに3つの圧縮オプション(LZMA、LZ4、Uncompressed)をサポートしています。

LZMA フォーマット

デフォルトでは、アセットバンドルをビルドしたとき、圧縮されたフォーマットで保存されます。標準的な圧縮フォーマットは、シリアル化されたデータファイルの単一の LZMA ストリームで、使用する前にアセットバンドルを解凍する必要があります。

LZMA 圧縮バンドルを使うと、ダウンロードサイズを最小にできますが、非圧縮と比較すると読み込み時間がはっきりわかるぐらい、解凍が遅くなります。

LZ4 フォーマット

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プロパティーで制御されます。これは、ディスクにキャッシュされるバンドルに影響を及ぼしメモリに記憶されます。

アセットバンドルを読み込むAPI

この表では異なる圧縮タイプと異なる読み込み方法を利用する場合のメモリとパフォーマンスのオーバーヘッドの比較を提供します。

非圧縮 圧縮チャンク(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 を使用して読み込む場合、以下のガイドラインを使用してください。

  1. StreamingAssetsとして、あなたのゲームでアセットバンドルを展開 - それを読み出すためバンドルとAssetBundle.LoadFromFileAsync をビルドするとき、BuildAssetBundleOptions.ChunkBasedCompression を使用します。これは、バッファを読み出すのに、データの圧縮と等しいメモリオーバーヘッドによる最速で読み込めるパフォーマンスを提供します。
  2. DLSとしてアセットバンドルをダウンロードする - デフォルトのビルドオプション(LZMA 圧縮)を使用して、ダウンロード、キャッシュするのに、LoadFromCacheOrDownload/WebRequest クラスを使用します。ここでは、さらに読み込みのための最良の圧縮比と AssetBundle.LoadFromFile のローディング パフォーマンスが持てます。
  3. 暗号化されたバンドル - BuildAssetBundleOptions.ChunkBasedCompression を選択し、ローディングの LoadFromMemoryAsync を使用します(これは、ほとんどがLoadFromMemory[Async]クラスを使用しなければならないところのシナリオのみです)。
  4. カスタム圧縮 - ビルドするとき BuildAssetBundleOptions.UncompressedAssetBundle を使い、カスタム圧縮アルゴリズムで解凍された後バンドルを読み込むとき AssetBundle.LoadFromFileAsync を使います。

一般的には、常に非同期関数を選択します – それらの関数は、メインスレッドを停止する事なく、ローディングをより効率的にキューに入れるように動作します。あわせて、同期と非同期の関数を同時に呼び出す事は、絶対に避けなくてはなりません – 同時に呼び出すと、メインスレッドの動作に引っかかりが発生する原因になります。

互換性

Asset Bundle のコンテナフォーマットは、新たな圧縮タイプをサポートし、将来的な改良の基礎を用意するために変更されました。 Unity 5 では Unity 4 で作成されたバンドルをサポートしていますが、早期のバージョン(2.x、3.x)で作成されたバンドルはサポートしていません。

アセットバンドルのビルド
アセットバンドルの内部構造