ShaderVariant その他 PreFilterとDynamic Shader Loading

ShaderVariant関連で少し情報の更新がありましたので、コチラ記事にします。

今回は以下のブログで紹介された PreFilterとDynamic Shader Loadingについてです。

PreFilteringについて

PreFilteringは、IPreprocessShaders.OnProcessShaderよりも前に実行して、引数「IList<ShaderCompilerData> data 」の要素数を抑える事で諸々の高速化をするためのものになっています。

C# 側にListとして渡すためには、どうしてもメモリコピーなど余計な部分が挟まってしまいます。その前に要素数を抑えて出来るだけ処理を早くしようという所が主だと思われます。

このような感じで条件に一致した時にキーワードを消すといったことを行います

using UnityEditor.ShaderKeywordFilter;

[ApplyRulesIfNotGraphicsAPI(GraphicsDeviceType.OpenGLES2, GraphicsDeviceType.OpenGLES3, GraphicsDeviceType.OpenGLCore)]
[SelectIf(true, keywordNames: "FeatureA")]
bool forceFeatureA;

https://docs.unity3d.com/ScriptReference/ShaderKeywordFilter.ApplyRulesIfNotGraphicsAPIAttribute.html

Dynamic Shader Loadingについて

これまでShader内に複数のVariantがあった際は、Shaderロード時に全てのShaderVariantがメモリ上に載っていました。

そのため、ShaderVariantが沢山あるShaderが数十M、時には100M単位でメモリを消費してしまうという事がありました。

このロード時に消費するのを止めようというものになります。
PlayerSettingsやShader.maximumChunksOverrideと言った値で制御が可能になります。

全部ロードしない事によって意図しないスパイクなども生まれる可能性があるため、その点は注意が必要そうです。

関連記事


この記事が気に入ったらサポートをしてみませんか?