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 をキャッシュするほうが良さそうでした