LoginSignup
6
1

More than 3 years have passed since last update.

[Unity] GetIncetanceID の速度確認

Posted at

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

簡単ですが、以上

6
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
1