Material に パラメータをセットする際には Material.SetColor や Material.SetVector などを利用する
この際に第一引数には string と int を指定することができる
string の場合でも 結局 int に変換されるのですが、この変換処理が遅いらしいので調べてみた
public void SetColor(string name, Color value) { this.SetColorImpl(Shader.PropertyToID(name), value); }
計測方法
1万回のパラメータをセットする時間を計測する
public class SampleMonoBehaviour : MonoBehaviour { [SerializeField] private Material _material; private void Start() { var material1 = new Material(_material); Profiler.BeginSample("SetMaterialString"); for (int i = 0; i < 10000; i++) { material1.SetColor("_Color", Color.white); } Profiler.EndSample(); var id = Shader.PropertyToID("_Color"); Profiler.BeginSample("SetMaterialId"); for (int i = 0; i < 10000; i++) { material1.SetColor(id, Color.white); } Profiler.EndSample(); } }
計測結果
string を引数にした場合のほうが 1.5倍ほど遅かった
特に理由がない限りは Shader.PropertyToID を利用して ID をキャッシュするほうが良さそうでした
