Version: 2020.3
言語: 日本語
アセットバンドルを使いこなす
アセットバンドルにパッチを適用する

アセットバンドルの圧縮

AssetBundle (アセットバンドル) の圧縮形式

デフォルトでは、Unity は LZMA 圧縮でアセットバンドルを作成し、LZ4 圧縮でそれらをキャッシュします。ここでは、両方の圧縮形式について説明します。

Unity の アセットバンドルビルドパイプライン は LZMA 圧縮でアセットバンドルを作成します。この圧縮形式は、アセットバンドル全体を表すデータのストリームです。つまり、これらのアーカイブからアセットを読み取る必要がある場合は、 ストリーム全体を解凍する必要があります。ファイルサイズは LZ4 圧縮のものよりも小さいため、Content Delivery Network (CDN) からダウンロードしたアセットバンドルには LZMA 圧縮形式が推奨されます。

一方、LZ4 圧縮はチャンクベースの圧縮アルゴリズムです。Unity が LZ4 アーカイブのアセットにアクセスする必要がある場合、リクエストされたアセットのバイトを含むチャンクを解凍して読み込むだけです。これは、Unity が両方のアセットバンドルキャッシュで使用する圧縮方法です。アセットバンドルをビルドして、LZ4 (HC) 圧縮を強制する場合は、BuildAssetBundleOptions.ChunkBasedCompression 値を使用してください。

BuildAssetBundleOptions.UncompressedAssetBundle を使用するときに Unity が作成する非圧縮のアセットバンドルは解凍を必要としませんが、より多くのディスクスペースを占有します。非圧縮のアセットバンドルは 16 バイトに揃えられています。

アセットバンドルキャッシュ

WWW または UnityWebRequest (UWR) を使用して LZMA アセットバンドルの取得、再圧縮、バージョン管理を最適化するために、Unity は 2 つのキャッシュを維持します。

  • メモリキャッシュ はアセットバンドルを UncompressedRuntime 形式で RAM に保存します。

  • ディスクキャッシュ は、取得したアセットバンドルを、後述する圧縮形式で書き込み可能なメディアに保存します。

メモリキャッシュにロードされたアセットバンドルは大量のメモリを消費します。アセットバンドルのコンテンツに頻繁かつ迅速にアクセスしたい場合を除いて、メモリキャッシュはメモリコストに見合わないでしょう。代わりに、ディスクキャッシュを使用してください。

UWR API にバージョンパラメーターを指定すると、Unity はアセットバンドルのデータをディスクキャッシュに保存します。 バージョンパラメーターを指定しない場合、Unity はメモリキャッシュを使用します。バージョンパラメーターは、バージョン番号かハッシュのいずれかです。Caching.compressionEnabled が true に設定されている場合、アセットバンドルをディスクに書き込むときに、後続のすべてのダウンロードに対して LZ4 圧縮を適用します。キャッシュ内の既存の非圧縮データは圧縮しません。Caching.compressionEnabled が false の場合、Unity はアセットバンドルをディスクに書き込むときに圧縮を適用しません。

アーカイブを目的の形式に再圧縮する必要があるため、キャッシュされた LZMA アセットバンドルを最初にロードするのに長い時間がかかります。それ以降のロードでは、キャッシュされたバージョンが使用されます。

AssetBundle.LoadFromFile または AssetBundle.LoadFromFileAsync は LZMA アセットバンドルのメモリキャッシュを使用するため、UWR API を使用する必要があります。UWR API を使用できない場合は、AssetBundle.RecompressAssetBundleAsync を使用してディスク上の LZMA AssetBundle を書き直すことができます。

ノート: WebGL は、アセットバンドルの LZMA 圧縮をサポートしていません。WebGL プラットフォームのアセットバンドルで LZ4 圧縮を使用します。詳細は、WebGL プロジェクトのビルドと実行 を参照してください。

内部テストでは、メモリキャッシュの代わりにディスクキャッシュを使用すると、少なくとも、RAM 使用量に大きな違いがあることが示されています。メモリの影響と追加のディスクスペース要件とアプリケーションのアセットのインスタンス化にかかる時間のトレードオフを考慮する必要があります。

アセットバンドルを使いこなす
アセットバンドルにパッチを適用する