[Unity3D 实践] 小测试 GetComponent()函数的效率

GetComponent()3种重载版本

T GetComponent<T>()
Component GetComponent(Type type)
Component GetComponent(string type)

在Unity3D脚本中,我们通过调用Component类的GetComponent函数来获取GameObject上的组件,那么:

各版本GetComponent方法的执行效率究竟如何?

如果在脚本中建立局部变量保存常用组件对象的引用(避免重复调用GetComponent()方法),究竟能提升多少效率?

结论
运行效率排名: 局部变量 >> GetComponent<T>() > GetComponent(Type type) >> GetComponent(string type)

自定义组件:

调用局部变量大约比调用GetComponent()方法快1个数量级以上
GetComponent(string type)相比另外两个重载版本慢接近2个数量级
GetComponent(Type type)GetComponent(string type)的返回值是Component类型的对象,使用前还需要进行一次类型转换
transform组件:

调用局部变量比调用Component静态变量transform稍微快一些,时间消耗比例大致为 5:8

测试过程

在Unity3D场景中新建一个GameObject,挂一个下面的脚本,运行游戏,点击右键进行测试。

using UnityEngine;
using System;
 
public class TestComponent : MonoBehaviour {
 
    public Vector3 position = Vector3.zero;
 
    private void Update()
    {
        if (Input.GetMouseButtonDown(1))
        {
            int times = 1000 * 100;
            Vector3 pos;
 
            Transform localTransform = transform;
            Debug.Log("开始测试:");
 
            //测试Transform组件
            TestExecuteSpeed("GetComponent(string Transform)", () => { pos = ((Transform)GetComponent("Transform")).position; }, times);
            TestExecuteSpeed("GetComponent(Type Transform)", () => { pos = ((Transform)GetComponent(typeof(Transform))).position; }, times);
            TestExecuteSpeed("GetComponent<Transform>()", () => { pos = GetComponent<Transform>().position; }, times);
            TestExecuteSpeed("Component.transform", () => { pos = transform.position; }, times);
            TestExecuteSpeed("local transform", () => { pos = localTransform.position; }, times);
 
 
            //测试自定义组件
            TestComponent testComponent = this;
            TestExecuteSpeed("GetComponent(string TestComponent)", () => { pos = ((TestComponent)GetComponent("TestComponent")).position; }, times);
            TestExecuteSpeed("GetComponent(Type TestComponent)", () => { pos = ((TestComponent)GetComponent(typeof(TestComponent))).position; }, times);
            TestExecuteSpeed("GetComponent<TestComponent>()", () => { pos = GetComponent<TestComponent>().position; }, times);
            TestExecuteSpeed("local testComponent", () => { pos = testComponent.position; }, times);
        }
    }
 
    //测速泛型方法
    static void TestExecuteSpeed(string taskName, Action Task, int times)
    {
        int repeatTimes = 3;
        float totalTime = 0f;
        float stopWatch;
        for (int i = 0; i < repeatTimes; i++)
        {
            stopWatch = Time.realtimeSinceStartup;
            for (int j = 0; j < times; j++)
            {
                Task();
            }
            totalTime += Time.realtimeSinceStartup - stopWatch;
        }
        totalTime /= repeatTimes;
        Debug.Log(string.Format("花费{2},运行[{0}]共{1}次(测试{3}次取平均值)", taskName, times.ToString("N0"), totalTime.ToString("F4"), repeatTimes)); 
    }
}

测试结果

在这里插入图片描述
Unity3D优化

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值