【Unity】AssetBundleのパフォーマンスを計測してみた~Unity5.3.1編~

Unity Advent Calendar 2015の16日目の記事になります。
※遅くなりましてすいません。。。

========
Unity5.3からAssetBundleの新しい圧縮形式(LZ4)が出た!ということで、
「どんだけパフォーマンスが違うのだろう?」っと思い「よっしゃ!計測したろ!」っ思いったったが、
変なところで色々難航してしまい、なんとも言えないデータになってしまいました。。。
しかし、それなりの指標になるのでは・・・・?っとポジティブに捉え公開させていただきます!
「ほーん (○´_U`○)」な感じで見ていただけると幸いです。
※5.3.1f1エディタ上での計測になります。

スポンサーリンク

使用想定

パフォーマンスを測定するにあたり、使用時を想定して計測しようかと考えまして、
おそらくよくある流れの、

「アセットバンドルをネット上からDLしてきて、それをローカルストレージに書き込む。使用時はローカルストレージから読み込む」

こちらの想定でいきたいと思います。

アセットバンドルの対象

アセットバンドルの対象ファイルは以下のようにしました

  • 256*256のPNG画像200個
  • 圧縮設定は16bit
  • エディタの表記では1つ170.7KB

アセットバンドル種類

計測したアセットバンドルの種類は、Unity4の事も考慮して以下の6つにしました

  1. LZMA圧縮形式で、200個の画像を1つのアセットバンドルに
  2. LZMA圧縮形式で、200個の画像を1つ1つアセットバンドル化(計200個)しそれをZIP化し1つのZIPファイルに
  3. LZ4圧縮形式で、200個の画像を1つのアセットバンドルに
  4. LZ4圧縮形式で、200個の画像を1つ1つアセットバンドル化(計200個)しそれをZIP化し1つのZIPファイルに
  5. 無圧縮で、200個の画像を1つのアセットバンドルに
  6. 無圧縮で、200個の画像を1つ1つアセットバンドル化(計200個)しそれをZIP化し1つのZIPファイルに

※ZIPライブラリはDotNetZipを使用しました。

ダウンロード計測

まずはダウンロード周りからのパフォーマンス。

アセットバンドル(ZIP)ファイル容量

容量
LZMA 948KB
LZMA(ZIP) 1.43MB
LZMA(ZIP解凍後の合計) 1.67MB
LZ4 1.74MB
LZ4(ZIP) 1.67MB
LZ4(ZIP解凍後の合計) 2.46MB
無圧縮 33.4MB
無圧縮(ZIP) 1.79MB
無圧縮(ZIP解凍後の合計) 34.3MB

やはりLZ4はLZMAよりサイズがでかくなってますね。
無圧縮ZIPが意外と小さいのも驚き。

ダウンロード使用メモリ

ダウンロード時に使用したであろうメモリ使用量
ダウンロード方法は以下の3つで計測

  1. WWW
  2. WWW.LoadFromCacheOrDownload
  3. UnityWebRequest
WWW WWW.LoadFromCacheOrDownload UnityWebRequest
LZMA 3.5MB 0.5MB 2.3MB
LZMA(ZIP) 0.5MB 0.5MB 1.5MB
LZ4 2.1MB 0.5MB 1.4MB
LZ4(ZIP) 0.8MB 0.6MB 2MB
無圧縮 35.4MB 0.5MB 33MB
無圧縮(ZIP) 0.6MB 0.4MB 1.5MB

当然ですが、ファイル容量ぐらいメモリを使用してました。
LoadFromCacheOrDownloadの結果は多分おかしい。

ローカルストレージへの書き込み時間

お次はダウンロードしたデータ(アセットバンドル)のストレージへの書き込み時間
ZIPは解凍+書き込み時間を計測

書き込み時間
LZMA 4ms
LZMA(ZIP) 1464ms
LZ4 5ms
LZ4(ZIP) 1286ms
無圧縮 125ms
無圧縮(ZIP) 2187ms

エディタだから早すぎた・・・・
とは言えZIP解凍にここまでかかることに改めて驚き

ローカルストレージからの読み込み計測

次に保存したアセットバンドルをローカルストレージから読み込んで、1つの画像をImageに反映させるまでの時間とメモリを計測

読み込み時間

ダウンロード方法は以下の5つで計測

  1. WWW
  2. WWW.LoadFromCacheOrDownload
  3. UnityWebRequest
  4. AssetBundle.LoadFromFileAsync
  5. AssetBundle.LoadFromMemoryAsync
WWW LoadFromCacheOrDownload UnityWebRequest LoadFromFileAsync LoadFromMemoryAsync
LZMA 208ms 24ms 208ms 211ms 224ms
LZ4 27ms 24ms 27ms 23ms 26ms
無圧縮 58ms 24ms 62ms 23ms 83ms
PNG画像直読み 10ms

LZ4きてますね!ここまで早いとは思わなかった。
LoadFromCacheOrDownloadの結果は多分おかしい。

読み込み時の使用メモリ

WWW LoadFromCacheOrDownload UnityWebRequest LoadFromFileAsync LoadFromMemoryAsync
LZMA 4.1MB 1.2MB 4.0MB 4.1MB 5.0MB
LZ4 3.1MB 1.2MB 3.0MB 1.2MB 3MB
無圧縮 35MB 1.2MB 35MB 0.4MB 35MB
PNG画像直読み 0.5MB

LZ4またまたきてますね!
あとLoadFromFileAsyncも優秀!
LoadFromCacheOrDownloadの結果は多分おかしい。

総評

データの信ぴょう性はいまいちながら、LZ4スゴイ
LZMAよりは確かに容量が大きいがUnity4時代によく利用されていたであろう無圧縮ZIPとほぼ同じなので問題ない気配
そして新たに圧縮したAssetBundle読み込みに対応したLoadFromFileAsyncスゴイ

========
Unity Advent Calendar 2015の16日目の記事としてかかせていただきました。
16日から1週間遅れとなってしまい本当に申し訳ないです。
ほんの少しでも参考になりましたら幸いです。

スポンサーリンク

フォローする