2020年一発目の記事です。
MayaのOpenMaya関連の続きも書きたいのですが、
ちょっと今回はUnityでのテクスチャーのメモリ使用量の話です。
Substanceから出力したPNGやTGAなどではなく、.sbsarファイルを出力。
それをUnityにImportして、その中のマテリアル・テクスチャーをPlaneに貼ったものを
Android用にビルドして計測してみました。
※間違っていることがあればブログのコメントやTwitterの方で教えて頂けると幸いです。
今回使ったものは
・Unity 2019.3.0f1
( 2018以降は .sbsar を読み込むためにAssetStoreからプラグインを入れないと使えなくなっています。 )
・Substance Designer 2020
・Xperia XZ Premium (2017年の夏モデルなので少し古いです)
・sbsarファイル
( レンガのデータ )
( Substance_Desginer_で素材のつくり方_初級 の中のデータ )
( UnityのAssetStoreからDLしたフローリングのデータ )
④Substance Designerで新規のStandardのGraph
( DuffuseのcolorをUnity側でいじれるようにExposeしただけのシンプルなデータで、
以下でNaturalStandardと書いているものです)
検証に使用したSubstanceのデータとUnity上のシーンデータ構成
今回の検証は下図の左のように、
3枚のPlaneオブジェクトを縦に並べ、それぞれ別々のマテリアルを割り当てています。
ちなみに表示されている文字は、上から
オブジェクト名
メイン(ベースカラー)テクスチャー名
メインテクスチャーのサイズとフォーマット
実機上で取得したものを文字列として表示しています。
①Bricks Lumpy
②Chapter3_Wood
③Parquet01
④NaturalStandard
また、テクスチャー名についている GenerateOnLoadON / OFF は
右のように Unity の SubstanceGraph の Inspector 上の設定の
「Generate on load」 を切り替えているものです。
_Baked とついているテクスチャーは
同じく右の「Bake textures to folder」ボタンで
PNGファイルとして出力したテクスチャーの事です。
実機上でのメモリ使用量を計測
ではまず、今回一番メインとなる実機上でのメモリサイズの比較です。
①・②・④のデータを使ってビルドしたアプリをUnityのProfilerで計測したものです。
これらを見て頂いてわかるように 2048*2048 のテクスチャー(Format : RGBA_ETC2)のメモリー使用量は
● .sbsarから直接生成されたテクスチャー 6.7MB
● Bakeしたテクスチャー 1.3MB (RGBのみのものは1.0MB)
となることがわかります。
サイズ違いのテクスチャーのメモリ使用量
上図はそれぞれ 2048*2048 : 1024*1024 : 512*512 のテクスチャーのメモリー使用量です。
●④NaturalStandard
1024*1024 1.8MB
512*512 469.7KB
●①Bricks Lumpy
1024*1024 0.5MB (RGBのみのものは256.3KB)
512*512 128.3KB (RGBのみのものは64.3KB)
実機上で.sbsarのexporseしているパラメータを変更してみる
④のNaturalStandardのデータは、SubstanceDesigner上で「outputcolor」という名前でカラー値をexposeしており、
そのカラー値がそのままテクスチャーのカラーになっています。
そのパラメーターを下に貼っているスクリプトで5秒おきに color1 と color2 に設定した色へ
交互に変更している状態のメモリ使用量が下の右側のスクリーンショットです。
上の2つのスクリーンショットを見て頂くとわかるように、スクリプトでパラメーターを変更すると
テクスチャーフォーマットがRGBA_ETC2だったものがR8G8B8A8の32bitのフォーマットになり、
2048*2048 (RGBA) のテクスチャー1つあたり 32.2MB 使用しています。
こちらはアプリを起動した直後のフォーマットはETC2なのですが、
スクリプトで変更がかかるとRGBA32bitになってしまいます。
そして、この下のスクリーンショットは ④NaturalStandard にてスクリプトで
カラーを変更した場合のメモリーではなくCPU使用量です。
そして、比較のためにこちらが ③Parquet01 のカラーパラメーターを
同様にスクリプトで変更した場合のCPU使用量です。
こちらの比較からわかることは、当たり前ですが
カラーパラメーターを変更してテクスチャーを生成・レンダリングする処理時間は
.sbsのノードの複雑さと比例するということです。
ビルド時のログやapkファイルのサイズ
UnityでAndroid向けにapkファイルをビルドした際に
C:\Users\ユーザー名\AppData\Local\Unity\Editor
にある Editor.log というファイルに「Build Report」という情報が書き込まれます。
ここではその情報と出力されたapkファイルのサイズを比較していきます。
※Build Reportを全部コピーすると長くなるので一部抜粋です。
①Bricks Lumpy
apk : 54.1MB
Uncompressed usage by category (Percentages based on user generated assets only):
Textures 69.3 mb 81.7%
Used Assets and files from the Resources folder, sorted by uncompressed size:
53.3 mb 18.6% Assets/SubstanceAssets/brick_lumpy/brick_lumpy.sbsar
5.3 mb 1.9% Assets/BakedTex/brick_lumpy_Baked - metallic.png
2.7 mb 0.9% Assets/BakedTex/brick_lumpy_Baked - ambientOcclusion.png
2.7 mb 0.9% Assets/BakedTex/brick_lumpy_Baked - baseColor.png
2.7 mb 0.9% Assets/BakedTex/brick_lumpy_Baked - normal.png
2.7 mb 0.9% Assets/BakedTex/brick_lumpy_Baked - height.png
1.0 kb 0.0% Assets/Materials/BakedMat_Brick.mat
②Chapter3_Wood
apk : 56MB
Uncompressed usage by category (Percentages based on user generated assets only):
Textures 56.0 mb 78.3%
Used Assets and files from the Resources folder, sorted by uncompressed size:
42.7 mb 16.3% Assets/SubstanceAssets/Chapter3_Wood_2019.sbsar
5.3 mb 2.0% Assets/BakedTex/Wood_00_Baked - metallic.png
2.7 mb 1.0% Assets/BakedTex/Wood_00_Baked - baseColor.png
2.7 mb 1.0% Assets/BakedTex/Wood_00_Baked - normal.png
2.7 mb 1.0% Assets/BakedTex/Wood_00_Baked - height.png
③Parquet01
apk : 47.9MB
Uncompressed usage by category (Percentages based on user generated assets only):
Textures 42.7 mb 73.8%
Used Assets and files from the Resources folder, sorted by uncompressed size:
32.0 mb 14.1% Assets/SubstanceAssets/Parquet01/Parquet01.sbsar
5.3 mb 2.4% Assets/BakedTex/WoodenParquet_Baked - metallic.png
2.7 mb 1.2% Assets/BakedTex/WoodenParquet_Baked - baseColor.png
2.7 mb 1.2% Assets/BakedTex/WoodenParquet_Baked - normal.png
0.9 kb 0.0% Assets/Materials/WoodenParquet.mat
④NaturalStandard
apk : 27.6MB
Uncompressed usage by category (Percentages based on user generated assets only):
Textures 40.0 mb 72.5%
Used Assets and files from the Resources folder, sorted by uncompressed size:
32.0 mb 15.9% Assets/SubstanceAssets/NaturalStandard.sbsar
2.7 mb 1.3% Assets/BakedTex/NaturalStandard_Baked - specular.png
2.7 mb 1.3% Assets/BakedTex/NaturalStandard_Baked - normal.png
2.7 mb 1.3% Assets/BakedTex/NaturalStandard_Baked - diffuse.png
1.0 kb 0.0% Assets/SubstanceAssets/NaturalStandard_GenerateOnLoadOFF.mat
1.0 kb 0.0% Assets/SubstanceAssets/NaturalStandard_GenerateOnLoadON.mat
1.0 kb 0.0% Assets/Materials/BakedMat_NaturalStandard.mat
ここからはBuild Reportの内容を比較するために
①Bricks Lumpy と同じ .sbsar ファイルの中に複数のSubstanceGraphをつくり、
シーンの構成を変更してビルドしてみたものです。
①Bricks Lumpy 1種類1つ
apk : 34.8MB
Uncompressed usage by category (Percentages based on user generated assets only):
Textures 26.7 mb 63.2%
Used Assets and files from the Resources folder, sorted by uncompressed size:
26.7 mb 14.6% Assets/SubstanceAssets/brick_lumpy/brick_lumpy.sbsar
①Bricks Lumpy 2種類1つずつ
apk : 44.8MB
Uncompressed usage by category (Percentages based on user generated assets only):
Textures 53.3 mb 77.4%
Used Assets and files from the Resources folder, sorted by uncompressed size:
53.3 mb 21.7% Assets/SubstanceAssets/brick_lumpy/brick_lumpy.sbsar
①Bricks Lumpy 3種類1つずつ
apk : 55.7MB
Uncompressed usage by category (Percentages based on user generated assets only):
Textures 80.0 mb 83.7%
Used Assets and files from the Resources folder, sorted by uncompressed size:
80.0 mb 25.8% Assets/SubstanceAssets/brick_lumpy/brick_lumpy.sbsar
このような感じで、1つの.sbsarファイルのSubstanceGraphを増やすとアプリの容量が増えていくようです。
色々試してみましたが、個人的にはこの記事を書いている時点では
モバイルで .sbsar ファイルをそのまま使うには結構メモリを食ってしまうので
メモリに余裕がある制作じゃない限りはUnity上でBaked Textureにするか、
Substance側で画像ファイルとして書き出して使う方がいいかなと思います。
同じテクスチャーサイズで約5倍近くあるメモリ使用量の差が、
もし今後 Substanceプラグイン側 or Unity側 の更新で縮まるような事があれば
.sbsar ファイルのまま使用する事が可能になるかもしれませんね。
コメントをお書きください