こんにちは、Unityエンジニアのオオバです。
Materialの任意のプロパティを操作をする際に、
- SetFloat
- SetTexture
- SetInt
- SetColor...
などの関数を使用します。
文法的には
material.SetFloat("_Prop", 100f);
のように、第一引数にプロパティ名をString型、第2引数に値を渡します。また、オーバーロードで第1引数にプロパティユニークID(int型)を渡すことも出来ます。
すべてのマテリアルプロパティー関数に文字列を渡すよりもユニーク ID を使用したほうが効率的です。
Shader-PropertyToID - Unity スクリプトリファレンス
リファレンスを確認すると、ユニークIDを渡した方が効率が良いということで、どのくらいパフォーマンスに違いがあるのかを確認したいと思います。
また、このユニークIDは以下のShaderクラスのstatic関数で取得できます。
Shader.PropertyToID("PropertyName")
コチラの検証コードとフローで負荷を確認します。
- インスペクタからtoggle変数のチェックボタンを切り替える
- SetFloatオーバーロードを切り替える
- Unity Profilerで負荷を確認
PropertyToIdPerformance.cs · GitHub
このようにtoggle
フラグを切り替えると、明らかなパフォーマンスの違いが出ました。
文字列プロパティ指定 | ユニークID指定 |
---|---|
4.20ms | 1.73ms |
ユニークID指定の方が約2.5倍パフォーマンスが良いという結果です。
プロファイラーで処理の確認
文字列でプロパティ指定
ユニークIDでプロパティ指定
文字列でプロパティ指定すると、内部的にPropertyToID
を実行して更にSetFloat
が実行されていることが分かります。
※Deepプロファイラで実行しないと関数名まで表示されません
まとめ
これらの結果から、Materialに値を渡す場合は、
ユニークIDを使用一択だと思われます。
パフォーマンスを考慮する上では文字列指定を使う理由はなさそうです。
この記事が気に入ったらフォローしよう