[Unity] GetIncetanceID の速度確認


GetIncetanceID の速度検証

当たり判定で GetIncetanceID() を使って大丈夫なのかどうか、
調べても速度が出てこなかったので、念のため確認する。

検証

Collider をアタッチした GameObject を適当な場所に置き、
それにMeshRenderer,NaviMeshなど適当な複数のコンポーネントをアタッチする。
それに対して特定のクラス(Dummy)を参照することを想定する。

試行回数: 10,000,000

SpeedTest.cs
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を取るのが無難だと思われる。

簡単ですが、以上