Open2

Unity の BuiltIn パイプラインで ShaderGraph を使うとメモリ爆発

PitekiPiteki

BuiltIn 環境でも使えるようになった ShaderGraph。非常に便利でありがたい。
でも ShaderGraph を 5 ~ 6 ファイル含んだ状態でビルドした Android や iPhone の実機動作を確認するとメモリ使用量が Shader だけで 2.0 GB を超えるような爆発的な無駄遣いをしている状況になった。
よく見ると一つ一つの Shadergraph の Variant が 5万件以上などのすごい数が生成されていて、ビルド時間もかなりかかっていた。

試行錯誤して原因を調査すると、どうやら シーンでライトをベイクすると発生 することが分かった。
ライトのベイクに対応するための Shader Keyword が複数追加され Variant が肥大化する様子。

元の Shadergraph の作りが問題なのかとも考えたが、Lit で新規作成した空っぽの Shadergraph でも同じ症状が発生 し、それだけで 150 MB 程度の大きさになっていた。

回避策として ProjectSetting -> Graphics -> Lightmap modes にある Shader StrippingAutomatic から Custom に変更し、今回のシーンに最低限必要な Baked Directional のみにチェックを入れた状態でビルド。
結果的に Shader のメモリ使用量が 2.0 GB -> 400 MB 程度まで削減できた。

ただ 400 MB でもまだ大きい。あくまで暫定的な対応。
これ以上削減するには IPreprocessShaders.OnProcessShader を使って 不要な Variant の組み合わせを自分で Stripping するしかなさそう。

PitekiPiteki

ちなみに URP 環境で同じことをしても Variant 爆発は一切発生しなかった。
これは BuiltIn 環境だけで発生する症状の模様。