【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,ルートノードの下にあるノードを見つけた.私たち自身が実現したGetTopObjectでは、ルートノードが非表示になっているサブノードオブジェクトも見つけることができます.コードをオフにしたい:
//GetTopObjectコード:
ルートノードの下にあるノードを探す必要がある場合があります.それぞれの方法をテストした.現在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;
}