(:3[kanのメモ帳]

個人ゲーム開発者kan.kikuchiのメモ的技術ブログ。月木更新でUnity関連がメイン。

ResourcesをAssetBundleに置き換えるだけで、最大77%もの容量削減に繋がる【Unity】【AssetBundle】【容量削減】


このエントリーをはてなブックマークに追加


この記事でのバージョン
Unity 2017.4.6f1


はじめに

今回はResourcesをAssetBundleに置き換えると、

ビルドした実行ファイルのサイズがどの程度変わるのかという比較記事です!


なお、本記事に出てくる画像と音源のアセットは以下のものを使っています。






比較対象

比較に用いるのは画像ファイル(png)と音源ファイル(ogg)で、それぞれ約50MB分です。


f:id:kan_kikuchi:20180714084749j:plain
f:id:kan_kikuchi:20180714084740j:plain


また、ファイルの違いの他にもアセットの圧縮、非圧縮の比較も行いました。

ここで言う画像の圧縮、非圧縮はCompressionの事で、


f:id:kan_kikuchi:20180714082912j:plain
f:id:kan_kikuchi:20180714082949j:plain

None
テクスチャを圧縮しません。

High Quality
テクスチャを高品質の形式で圧縮します。メモリ使用は多くなります。


音源の圧縮、非圧縮はCompression Formatの事です。


f:id:kan_kikuchi:20180714082730j:plain
f:id:kan_kikuchi:20180714082743j:plain

PCM
品質は高くなりますが、ファイルサイズが大きくなります。非常に短い音響効果に最適です

Vorbis
圧縮ファイルは小さくなりますが PCM オーディオに比べると若干クオリティが落ちます。圧縮率は Quality スライダーの調整で可能です。この形式は中程度の長さの SE や音楽に適しています。


さらにAssetBundleはAssetBundleBrowserを使って、LZMAで圧縮しています。




f:id:kan_kikuchi:20180714083103j:plain

無圧縮でかい、LZMA遅い、LZ4はその間




比較方法

Resourcesに直接アセットを追加、またはStreamingAssetsにAssetBundle追加した後、

ビルドし、実行ファイルのサイズの比較を行いました。

ただし、ビルド時には画像か音源のどちらか一方だけを使っている感じです。


f:id:kan_kikuchi:20180714090401j:plain
f:id:kan_kikuchi:20180714090409j:plain


なお、ビルド対象はMacのappファイルです。


f:id:kan_kikuchi:20180714090606j:plain


比較結果

実際に比較した結果が以下の通りです。(単位はMB)

Resources AssetBundle
画像圧縮 202.8 89.6
画像非圧縮 240.4 95.9
音源圧縮 100.8 100.6
音源非圧縮 593 571.4


画像も音源も入ってない場合のファイルサイズが51.7MBだったので、それを差し引いた分で考えると

画像圧縮は約75%の容量削減、画像非圧縮は約77%の容量削減に繋がりました!


ただし、音源圧縮はほぼ0%、音源非圧縮でも約4%の容量削減にしか繋がらなかったので、

全てのアセットに対して容量削減に繋がるというわけではないようです。



------------追記------------

比較結果(Compression Method : LZ4HC)

上記の比較ではCompression MethodがDefaultだったので、

一番圧縮率が高いLZ4HCでも比較してみました。


f:id:kan_kikuchi:20180721150717j:plain


実際に比較した結果が以下の通りです。(単位はMB)

Resources AssetBundle
画像圧縮 108.1 89.2
画像非圧縮 120.9 95.5
音源圧縮 100.4 100.2
音源非圧縮 592.6 571


画像も音源も入ってない場合のファイルサイズが51.3MBだったので、それを差し引いた分で考えると

画像圧縮は約33%の容量削減、画像非圧縮は約36%の容量削減に繋がりました!

Compression MethodがDefaultの時に比べると圧縮率が下がりましたが、それでも有効なようです。


なお、音源圧縮はほぼ0%、音源非圧縮でも約4%の容量削減にしか繋がらなかったのは、

Compression MethodがDefaultの時と同じでした。


ただ、AssetBundleを使うとCompression Methodを何にしても大してサイズの変化がなかったので、

Default LZ4 LZ4HC
画像非圧縮(AssetBundle) 95.9 95.5 95.5


全アセットをAssetBundleでまとめている場合はCompression Methodの効果は薄いようです。


------------追記おわり------------


おわりに

AssetBundleにする時にさらに圧縮しているので、多少容量は減る気がしてましたが、

まさかここまで減るというのは驚きでした。


ただし、AssetBundleを使うと実装や管理の手間も増えることや、

AssetBundleをロードする時間が増える点には注意が必要です。

特に今回使ったLZMAはロードがかなり遅いので、LZ4を使った方が良いかもしれません。


また、対象のプラットフォームやUnityのバージョン、プロジェクトやリソースの内容によっても

違いが出るので、そこら辺も考慮して検討する必要があります。

iOSやPCでは有益ですが、Androidではむしろしない方が良さそうです。


とは言え、公式で「Resourcesフォルダのベストプラクティスは使用しない事である」

とされているぐらいなので、



どんなプロジェクトでも基本的に「Resourcesは使わずにAssetBundleを使う」

という方針で問題ないかと思います。