Unity3D實驗室之GameObject.Find方法效率的測試

驗證結果

結果是在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方法提高執行效率。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章