2 minutes
[Unity] transformはcacheした方が早いけど、gameObjectはどうなんだろう
お世話になっております。
しゃまとんです。
Unityでパフォーマンスのよいコードを書く上でコンポーネントを取得してしまって扱うのは常套手段ですよね。
transformはgameObject.transfromで呼び出すと実は毎回GetComponentしていて遅いということで自分も取得して使うようにしています。
GetComponentについて。
— 伊藤周@おなかソフト (@warapuri) May 13, 2016
同一GameObjectなら:RequireComponentとして、Startで取得
違うGameObjectなら:FindWithTagとAssertのコンボで#UnityTips pic.twitter.com/8tAeYBxmWn
そこで疑問があったのですが、gameObjectはどうなのかな〜もしかしてtransformみたいに遅かったりするのだろうか…と思い、 簡単ですが計測してみました。(他に誰か調べてたりしないかな…)
計測に利用したコードはこんな感じで、適当なゲームオブジェクトを作成してスクリプトをひっつけるだけです。
using UnityEngine;
using System.Collections;
using System.Diagnostics;
public class CacheTest : MonoBehaviour {
// Use this for initialization
void Start () {
Transform cacheTrans = transform;
var sw = new Stopwatch();
sw.Start();
for (int i = 0; i < 1000000; i++) {
Transform t = cacheTrans;
}
sw.Stop();
// キャッシュしたtransfrom
UnityEngine.Debug.Log("cacheTransform : " + sw.ElapsedMilliseconds);
sw.Reset();
sw.Start();
for (int i = 0; i < 1000000; i++) {
Transform t = transform;
}
sw.Stop();
// キャッシュしてないtransform
UnityEngine.Debug.Log("getTransform : " + sw.ElapsedMilliseconds);
GameObject cacheObj = gameObject;
sw.Reset();
sw.Start();
for (int i = 0; i < 1000000; i++) {
GameObject g = cacheObj;
}
sw.Stop();
// キャッシュしたgameObject
UnityEngine.Debug.Log("cacheGameObject : " + sw.ElapsedMilliseconds);
sw.Reset();
sw.Start();
for (int i = 0; i < 1000000; i++) {
GameObject g = gameObject;
}
sw.Stop();
// キャッシュしてないgameObject
UnityEngine.Debug.Log("get GameObject : " + sw.ElapsedMilliseconds);
}
}
で計測してみたら、transformと似たような結果になりました。
gameObjectも場合によってはキャッシュしたほうがよいかもですね。
以上です。
■参考