【unity】GameObject.Find 的性能开销分析

有时需要找根节点下的一些节点。测试了一下各个方法,发现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, 找到了根节点下的一个节点。


我们自己实现的 UnityHelper.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;
    }


你可能感兴趣的:(优化,Unity)