驗證結果
結果是在Unity編輯環境下測試10次的平均值,單位是秒,Unity版本是5.6.5
對象數量 | 搜索方法 | 執行1000次 | 運行10,000次 | 100,000次執行 |
---|---|---|---|---|
100 | Find | 0.002197409秒 | 0.0190155秒 | 0.1939484秒 |
100 | FindGameObjectWithTag | 0.0002516746秒 | 0.001338196秒 | 0.01151428秒 |
100 | FindObjectOfType | 0.2374741秒 | 2.544969秒 | 5.801984秒 |
1000 | Find | 0.037534秒 | 0.357311秒 | 3.543825秒 |
1000 | FindGameObjectWithTag | 0.000655秒 | 0.002315秒 | 0.018519秒 |
1000 | FindObjectOfType | 0.157907秒 | 1.552248秒 | 16.20919秒 |
10000 | Find | 0.429361秒 | 4.274960秒 | 42.64132秒 |
10000 | FindGameObjectWithTag | 0.000346秒 | 0.001686秒 | 0.016235秒 |
10000 | FindObjectOfType | 1.375987 秒 | 14.24521秒 | 太長省略 |
驗證腳本如下
using System;
using UnityEngine;
/// <summary>
/// Find 系列方法執行速度測試腳本
/// </summary>
public sealed class FindTest : MonoBehaviour{
public int LoopCount = 1000;
public int TestCount = 10;
public int NumGameObjects = 100;
private void Awake(){
var types = new PrimitiveType[]{
PrimitiveType.Capsule,
PrimitiveType.Cube,
PrimitiveType.Cylinder,
PrimitiveType.Plane,
PrimitiveType.Quad,
PrimitiveType.Sphere,
};
for (int i = 0; i < NumGameObjects; i++){
GameObject.CreatePrimitive(types[UnityEngine.Random.Range(0, types.Length)]);
}
}
private void OnGUI()
{
DrawButton(0, "Find", () => GameObject.Find("Player") );
DrawButton(100, "FindGameObjectWithTag", () => GameObject.FindGameObjectWithTag("Player") );
DrawButton(200, "FindObjectOfType", () => GameObject.FindObjectOfType<BoxCollider>() );
}
private void DrawButton(float buttonY, string buttonText, Action findAct)
{
if (GUI.Button(new Rect(0, buttonY, Screen.width, 100), buttonText))
{
var sum = 0f;
for (int i = 0; i < TestCount; i++)
{
var time = Time.realtimeSinceStartup;
for (int j = 0; j < LoopCount; j++)
{
findAct();
}
time = Time.realtimeSinceStartup - time;
sum += time;
}
var avg = sum / TestCount;
Debug.Log(avg);
}
}
}
結論
通過上面測試的結果表明:Find方法和FindObjectOfType方法與查找的對象數量和查找次數成正比,即對象數量越多,查找次數越多,方法執行的越慢。特別是FindObjectOfType方法是搜索整個遊戲的對象中的所有組件,所以很慢。
而FindGameObjectWithTag方法,對象數量和查找次數增加,執行的效率沒有明顯的變慢。因此,如果遊戲對象的查找速度是瓶頸的話,應該改用FindGameObjectWithTag方法提高執行效率。