GetComponent()的3种重载版本
T GetComponent()
Component GetComponent(Type type)
Component GetComponent(string type)
在Unity3D脚本中,我们通过调用Component类的GetComponent函数来获取GameObject上的组件,那么:
各版本GetComponent方法的执行效率究竟如何?
如果在脚本中建立局部变量保存常用组件对象的引用(避免重复调用GetComponent()方法),究竟能提升多少效率?
结论
运行效率排名: 局部变量 >> GetComponent() > 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()", () => { pos = GetComponent().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()", () => { pos = GetComponent().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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?