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

アセットバンドルの圧縮

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

LZMA フォーマット

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

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

LZ4 フォーマット

Unity は、LZ4圧縮もサポートしており、ファイルサイズが大きくなりますがアセットバンドルの使用前に全体のバンドルを解凍するのは必須ではありません。LZ4では “チャンクベース” のアルゴリズムで動作します。したがって、オブジェクトがLZ4圧縮バンドルから読み込まれる場合、そのオブジェクトに対応するチャンクのみが解凍されます。これは動作中に起こり、使用前にバンドル全体を解凍する待ち時間がないことを意味します。LZ4 フォーマットはUnity 5.3で導入され、5.3以前のバージョンでは利用できません。

非圧縮フォーマット

第3の圧縮オプションは、まったく圧縮しません。非圧縮のバンドルは大きいですが、いったんダウンロードしてしまえば、アクセスするには最速です。

圧縮バンドルのキャッシュ

WWW.LoadFromCacheOrDownload 機能をダウンロードし、ディスクにアセットバンドルをキャッシュすると、その後は、大幅に読み込み時間が高速化します。 Unity 5.3以降から、キャッシュされたデータも LZ4 アルゴリズムで圧縮することが可能です。非圧縮バンドルと比較すると、これはスペースを40%~60%節約します。再圧縮がダウンロード中に行われるので、エンドユーザーにほとんど気付かれません。データがソケットから到着すると、Unity は、そのデータを解凍し、LZ4フォーマットで再圧縮を行います。この再圧縮がダウンロードのストリーミング中に実行されるのは、十分なデータ量がダウンロードされるとキャッシュの圧縮がすぐに始まるためで、ダウンロードが終了するまで増分的に継続します。その後、データが必要なときに動作中のチャンクを解凍することでキャッシュされたバンドルからデータを読み出します。

Cache の圧縮は、デフォルトで有効になり、Caching.compressionEnabledプロパティーで制御されます。これは、ディスクにキャッシュされるバンドルに影響を及ぼしメモリに記憶されます。

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

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

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

  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)で作成されたバンドルはサポートしていません。

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