Unity の BuiltIn パイプラインで ShaderGraph を使うとメモリ爆発
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 Stripping
を Automatic
から Custom
に変更し、今回のシーンに最低限必要な Baked Directional
のみにチェックを入れた状態でビルド。
結果的に Shader のメモリ使用量が 2.0 GB -> 400 MB 程度まで削減できた。
ただ 400 MB でもまだ大きい。あくまで暫定的な対応。
これ以上削減するには IPreprocessShaders.OnProcessShader を使って 不要な Variant の組み合わせを自分で Stripping するしかなさそう。
ちなみに URP 環境で同じことをしても Variant 爆発は一切発生しなかった。
これは BuiltIn 環境だけで発生する症状の模様。