読者です 読者をやめる 読者になる 読者になる

渋谷ほととぎす通信

完全趣味でやってるUnityメモ。説明できないところを説明できるようにするための個人ブログ。昨日の自分より少しでも大きく慣れるように。。。 ※所属団体とは一切関係がありません

Unity PropertyToID関数のパフォーマンスチェック


f:id:esakun:20150730215258g:plain

Materialの任意のプロパティを操作をする際に、

  • SetFloat
  • SetTexture
  • SetInt
  • SetColor…

などの関数を使用します。

文法的には

material.SetFloat("_Prop", 100f);

のように、第一引数にプロパティ名をString型、第2引数に値を渡します。また、オーバーロードで第1引数にプロパティユニークID(int型)を渡すことも出来ます。

すべてのマテリアルプロパティー関数に文字列を渡すよりもユニーク ID を使用したほうが効率的です。

Unity - スクリプトリファレンス: Shader.PropertyToIDより

リファレンスを確認すると、ユニークIDを渡した方が効率が良いということで、どのくらいパフォーマンスに違いがあるのかを確認したいと思います。

また、このユニークIDは以下のShaderクラスのstatic関数で取得できます。

Shader.PropertyToID("PropertyName")

コチラの検証コードとフローで負荷を確認します。

  1. インスペクタからtoggle変数のチェックボタンを切り替える
  2. SetFloatオーバーロードを切り替える
  3. Unity Profilerで負荷を確認

f:id:esakun:20170228023515g:plain

このようにtoggleフラグを切り替えると、明らかなパフォーマンスの違いが出ました。

文字列プロパティ指定 ユニークID指定
4.20ms 1.73ms

※1フレームにかかるSetFloatの処理時間です

ユニークID指定の方が約2.5倍パフォーマンスが良いという結果です。
※あくまでUnityEditor上での結果。※毎フレーム5000回Materialアクセスしている。

プロファイラーで処理の確認

文字列でプロパティ指定

f:id:esakun:20170228023814p:plain

ユニークIDでプロパティ指定

f:id:esakun:20170228023757p:plain

文字列でプロパティ指定すると、内部的にPropertyToIDを実行して更にSetFloatが実行されていることが分かります。
※Deepプロファイラで実行しないと関数名まで表示されません

まとめ

これらの結果から、Materialに値を渡す場合は、ユニークIDを使用一択だと思われます。パフォーマンスを考慮する上では文字列指定を使う理由はなさそうです。

あわせてどうぞ

www.shibuya24.info

www.shibuya24.info

www.shibuya24.info

www.shibuya24.info

www.shibuya24.info