GetIncetanceID の速度検証
当たり判定で GetIncetanceID() を使って大丈夫なのかどうか、
調べても速度が出てこなかったので、念のため確認する。
検証
Collider をアタッチした GameObject を適当な場所に置き、
それにMeshRenderer,NaviMeshなど適当な複数のコンポーネントをアタッチする。
それに対して特定のクラス(Dummy)を参照することを想定する。
試行回数: 10,000,000
using System.Threading.Tasks;
using UnityEngine;
public class SpeedTest : MonoBehaviour
{
[SerializeField] Collider testTarget;
async void Start()
{
await Task.Delay(2000);
int Count = 10000000;
var sw1 = new System.Diagnostics.Stopwatch();
sw1.Start();
for (int i =0; i < Count;i++)
{
var a = testTarget.gameObject.GetComponent<Dummy>();
}
sw1.Stop();
Debug.Log("GetComponent : " + sw1.ElapsedMilliseconds);
var sw2 = new System.Diagnostics.Stopwatch();
sw2.Start();
for (int i = 0; i < Count; i++)
{
var b = testTarget.gameObject.GetInstanceID();
}
sw2.Stop();
Debug.Log("GetInstanceID : " + sw2.ElapsedMilliseconds);
}
}
結果
単位は ms
GetComponent : 1627
GetInstanceID : 635
流石にGetComponent より早いようですね!w 安心しました!w
しかしながら、GetInstanceID() でID を取得した後は、このIDがどのオブジェクトか検索する必要がありますので、以降の負荷も考慮しなければいけないという事。
特に初心者だったり、カジュアルゲームで数十フレームに1回しか衝突が発生しないなどだったら、そこまでコストをかける必要は無いように思える。
(まあ検証ながらもう作ってしまったけど!)
スムーズにInstanceIDで検索できる仕組みを整えた上で使うのでなければ、
ColliderのGameObjectから直接GetComponent しても悪くないのかな思った。
蛇足ではあるが、InstanceID は各スクリプト自体にも InstanceID が付与されているため、
gameObject のIDを取るのが無難だと思われる。
簡単ですが、以上