【unity】GameObject.Findのパフォーマンスオーバーヘッド分析

4108 ワード

ルートノードの下にあるノードを探す必要がある場合があります.それぞれの方法をテストして、GameObjectを発見しました.Find、確かに遅いです.
ルートノードの下にあるノードを探す必要がある場合があります.それぞれの方法をテストした.現在S_Inlandシーンでは、内部ノードが多く、スクリプトをテストし、検索ごとに100000回のオーバーヘッドを実行した結果、GameObject.Find("CameraForScenes"):                 6318000 GameObject.Find("/CameraForScenes"):               12714000 UnityHelper.GetTopObject("CameraForScenes"):         172000 GameObject.Find("/LightForScenes/LightForScenes"): 24164000 GameObject.Find("LightForScenes/LightForScenes"):  24009000 UnityHelper.GetTopObject("LightForScenes") Then transform.Find("/LightForScenes"): 24742000 UnityHelper.GetTopObject("LightForScenes") Then transform.Find("LightForScenes"):452000にGameObjectが表示されます.Findのすべてのノードが遍歴するのは,確かに少なく,ルートノードのオブジェクトはUnityHelperである.GetTopObject.Update関数はもっと少ないです.最後から2番目のデータがこんなに大きいのは、なぜGameObject go=UnityHelperなのか知っているだろう.GetTopObject("LightForScenes");             go.transform.Find("/LightForScenes"); 遅くなって、冒頭のスラッシュを加えて、transform.FindはGameObjectに相当するようです.Find,ルートノードの下にあるノードを見つけた.私たち自身が実現したGetTopObjectでは、ルートノードが非表示になっているサブノードオブジェクトも見つけることができます.コードをオフにしたい:
using UnityEngine;

public class TestGOFind : MonoBehaviour {
      void OnEnable()  {  DoTest();  }

    public void DoTest()
    {
        int count = 100000;

        int time = System.Environment.TickCount;
        for (int i = 0; i < count; ++i)
        {
            GameObject.Find("CameraForScenes");
        }
        Debug.Log("GameObject.Find("CameraForScenes"): " + (System.Environment.TickCount - time) * 1000);

        int time2 = System.Environment.TickCount;
        for (int i = 0; i < count; ++i)
        {
            GameObject.Find("/CameraForScenes");
        }
        Debug.Log("GameObject.Find("/CameraForScenes"): " + (System.Environment.TickCount - time) * 1000);

        int time3 = System.Environment.TickCount;
        for (int i = 0; i < count; ++i)
        {
            UnityHelper.GetTopObject("CameraForScenes");
        }
        Debug.Log("UnityHelper.GetTopObject("CameraForScenes"):" + (System.Environment.TickCount - time3) * 1000);

        int time4 = System.Environment.TickCount;
        for (int i = 0; i < count; ++i)
        {
            GameObject.Find("/LightForScenes/LightForScenes");
        }
        Debug.Log("GameObject.Find("/LightForScenes/LightForScenes"): " + (System.Environment.TickCount - time4) * 1000);

        int time5 = System.Environment.TickCount;
        for (int i = 0; i < count; ++i)
        {
            GameObject.Find("LightForScenes/LightForScenes");
        }
        Debug.Log("GameObject.Find("LightForScenes/LightForScenes"): " + (System.Environment.TickCount - time5) * 1000);
        int time6 = System.Environment.TickCount;
        for (int i = 0; i < count; ++i)
        {
            GameObject go = UnityHelper.GetTopObject("LightForScenes");
            go.transform.Find("/LightForScenes");
        }
        Debug.Log("UnityHelper.GetTopObject Then transform Find /LightForScenes: " + (System.Environment.TickCount - time6) * 1000);
        int time7 = System.Environment.TickCount;
        for (int i = 0; i < count; ++i)
        {
            GameObject go = UnityHelper.GetTopObject("LightForScenes");
            go.transform.Find("LightForScenes");
        }
        Debug.Log("UnityHelper.GetTopObject Then transform Find LightForScenes: " + (System.Environment.TickCount - time7) * 1000);
    }
  
}

//GetTopObjectコード:
    public static GameObject GetTopObject(string name)
    {
        UnityEngine.SceneManagement.Scene scene = SceneManager.GetActiveScene();
        GameObject[] rootObj = scene.GetRootGameObjects();
        foreach (GameObject obj in rootObj)
        {
            if (obj.name == name)
            {
                return obj;
            }
        }

        return null;
    }