渋谷ほととぎす通信

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

transformの取得に最適化がされていた件


f:id:esakun:20150730215258g:plain

最近多い、ふと気になったシリーズです。

昔(2~3年前)はtransform.localPosition = Vector3.zero;のようにtransformプロパティは直接アクセスすると、GetComponent()が内部的に実行されていて、処理負荷的に重いからキャッシュした方が良いよ!っていう話をよく聞きました。

じゃあ、最近のUnityはどうなっているか?

  1. transformプロパティにそのままアクセス
  2. GetComponent()を記述してアクセス
  3. transformをキャッシュしてアクセス

この3種の方法で確認します。

結果

f:id:esakun:20180501141401p:plain

1.transformプロパティにそのままアクセス3.transformをキャッシュしてアクセスがほぼ同じくらいの負荷(ただしキャッシュが最速)。
2.GetComponent<Transform>()を記述してアクセスが最遅という結果になりました。

プロファイラーのDeep Profileで内部処理を確認してみます。

方法 Transformアクセス処理 ざっくり処理時間
1.transformにそのままアクセス f:id:esakun:20180501131758p:plain 5.15ms
2.GetComponent()記述アクセス f:id:esakun:20180501131826p:plain 7.62ms
3.transformをキャッシュしてアクセス 特になし 3.79ms

※処理時間は10000回forループした数値です

このようにtransformプロパティアクセスは内部的にGetComponent()ではなく、最適化され、get_transform関数が実行されているようです。

検証コードはコチラ

まとめ

ガリガリチューニングするなら、昔ながらのTransformキャッシュが最も良いですが、transformアクセスもそこそこ最適化されているため、普通に使っちゃっても大きな問題はでないだろうという見解です(状況次第)。Transformアクセスの処理方法が変わったということが分かった事が今回の調査で良かったことです。

検証環境

  • Unity2018.1.0f1

ブログを書き終えた辺りで見つかるこのような記事。

gameObject.GetComponent<Transform>() と transform の違い(または Unity における省略記法について) - Qiita

なるほど、2017.2辺り時点でtransformプロパティの最適化が入っていたようですね。