【Unity/Substance】実機上でのsbsarのテクスチャーのメモリ使用量を調べてみた

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ファイル

 ①Bricks Lumpy

  ( レンガのデータ )

 ②Chapter3_Wood.sbs

  ( Substance_Desginer_で素材のつくり方_初級 の中のデータ )

 ③Parquet01

  ( 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 ファイルのまま使用する事が可能になるかもしれませんね。