Unity3D实验室之GameObject.Find方法效率的测试

作者: koo叔 分类: Unity3D 发布时间: 2018-04-06 22:44 编辑

验证结果

结果是在Unity编辑环境下测试10次的平均值,单位是秒,Unity版本是5.6.5

| 对象数量 | 搜索方法 | 执行1000次 |运行10,000次|100,000次执行|
| - | -: | -: |-:|-:|
| 100 | Find| 0.002197409秒 |0.0190155秒|0.1939484秒|
| 100 | FindGameObjectWithTag|<font color="#0000ff">0.0002516746秒 </font>|<font color="#0000ff">0.001338196秒</font>|<font color="#0000ff">0.01151428秒</font>|
| 100 | FindObjectOfType| <font color="#ff0000">0.2374741秒</font> |<font color="#ff0000">2.544969秒</font>|<font color="#ff0000">5.801984秒</font>|
| 1000 | Find| 0.037534秒 |0.357311秒|3.543825秒|
| 1000 | FindGameObjectWithTag|<font color="#0000ff">0.000655秒</font>|<font color="#0000ff">0.002315秒</font>|<font color="#0000ff">0.018519秒</font>|
| 1000 | FindObjectOfType| <font color="#ff0000">0.157907秒</font>|<font color="#ff0000">1.552248秒</font>|<font color="#ff0000">16.20919秒</font>|
| 10000 | Find| 0.429361秒|4.274960秒|42.64132秒|
| 10000 | FindGameObjectWithTag|<font color="#0000ff">0.000346秒</font>|<font color="#0000ff">0.001686秒</font>|<font color="#0000ff">0.016235秒</font>|
| 10000 | FindObjectOfType|<font color="#ff0000">1.375987 秒</font>|<font color="#ff0000">14.24521秒</font>|<font color="#ff0000">太长省略</font>|

验证脚本如下

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方法提高执行效率。

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

发表评论

你的email不会被公开。必填项已用*标注

更多阅读
标签云