Texture Memoryダイエットをしよう for Android (改題)
はじめに
Texture Memoryがパフォーマンスランクに影響するようになりました。
ということで、ここはひとつ、いかに品質を落とさずにテクスチャー容量を減らすかを目指し、VRAMに優しいアバターにしていきましょう!
…と意気込んだところで、PC向けにはもう答えが出ていたので、そちらを紹介して終わりたいと思います。
https://qiita.com/lilxyzw/items/9aab99f976295971b8b0
Android(旧名Quest)プラットホームの場合
はい、という事で、本命行きます。
と言っても、テクスチャーの容量削減の基本は、解像度を落とす事です。これはAndroid向けでも同じです。まずは解像度を落とせるだけ落としましょう。解像度が1段落ちると、容量は1/4減ります。
その他細かいテクニックもPC向けと一緒なので、先ほど紹介した記事を参考にしてください。ではPC向けと何が違うかというと、圧縮形式です。
PC向けプラットホームでは、テクスチャーの圧縮形式には主にDXT/BCが使われます。一方で、Quest向け(Android)プラットホームでは、モバイルに最適化されたETC2/ASTC形式が使われます。
この圧縮形式の関係は似ていて、DXTとETC2はCrunch圧縮が使えます。BCとASTCはCrunch圧縮機能が存在せず、前者より新しい規格のため、より高品質(=劣化が少ない)です。
なお、最近のVRChatのSDKアップデートで、圧縮形式が無指定の時にASTCが選ばれる設定が自動適用されるようになりました。(手動でやる場合は下記画像参照)
ここでETC2とASTCの違いを、bpp※と共に掘り下げてみましょう。
※bpp:1ピクセルあたりのビット量。小さいほど高圧縮率である事を示す
RGB Compressed ETC2 (PCでいうDXT1):4 bpp、品質設定による違い無し
RGBA Compressed ETC2 (PCでいうDXT5):8 bpp、品質設定による違い無し
RGBA Compressed ASTC 4X4:8 bpp、「高品質」の時に採用される
RGBA Compressed ASTC 6X6:3.56 bpp、「標準品質」の時に採用される
RGBA Compressed ASTC 8X8:2 bpp、「低品質」の時に採用される
ETC2は、A(アルファ)チャンネル(要するに半透明)が無いテクスチャーにはRGB ETC2形式が採用され4bppとなり、AチャンネルのあるテクスチャーにはRGBA ETC2形式が採用されて8bppとなります。
一方ASTC形式はAチャンネルの有無に関わらずRGBA ASTCが使われますが、代わりに品質設定に応じてbppと見た目の綺麗さが変わります。ここで注目すべきは、標準品質のASTC 6X6の時点でRGB ETC2より高圧縮率という点です。しかもETC2よりも綺麗。Crunchを使わないなら、ASTCにしない手は無いわけです。
更に詰めるなら、「低品質」に落とすのも良いでしょう。標準品質の約半分になります。
場合によっては、「高品質」にしたうえで解像度を1段落とす事で、綺麗さを維持したまま更なる容量の半減を狙えるかもしれません。
ETC2 Crunch圧縮について
Questアバターにはシェーダー制限とアバター容量10MBまでのハードリミットも存在する関係上、Texture Memoryがアバターのパフォーマンスランク悪化要因になる事は稀かとは思います。そのためどちらかというと、テクスチャー容量の削減はアバター容量を減らすのが主目的になってきます。
アバター容量の限界を詰めるうえで、あえてETC2 Crunch形式にして、少しでもアバター容量を削減したい需要はあるかと思います。しかし、PC版と同じくCrunchはVRAMには影響しません。そのうえ、アバタービルド時の圧縮と二重圧縮になるため、アバター容量削減効果が薄く、ASTC 8x8(低品質)にする方がたいていの場合低容量にできます。Crunch圧縮は分の悪い最後の掛けだと考えてください。
まとめると
全てのテクスチャー:解像度を落とせるだけ落とす
全てのテクスチャー:圧縮品質を上げたら解像度が落とせないか探る
全てのテクスチャー:(許容できる範囲で)圧縮品質を落とす
頂点シェーダー用(アウトラインやファーのマスク)のテクスチャー:Generate Mipmapsのチェックを外す
アルファチャンネルを使わないテクスチャー:Alpha SourceをNoneにする
参考文献
https://qiita.com/lilxyzw/items/9aab99f976295971b8b0
https://docs.unity3d.com/ja/2021.3/Manual/class-TextureImporterOverride.html