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