うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【Unity】Material にパラメータをセットする際の速度計測

Material に パラメータをセットする際には Material.SetColorMaterial.SetVector などを利用する

この際に第一引数には stringint を指定することができる

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

f:id:hacchi_man:20200704203929p:plain