UnityGetComponentProfile

Unity上getComponent效率分析

getComponent主要有三个方法:

getComponent() 这个方法就是传一个模板类进去,然后返回也是这个模板类型的class或者null

getComponent(typeof(T)) 这个方法就是传类型进去

getComponent(className) 这个方法传的是className,一个string

测试代码:

`

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
private void TestTime()
{
Debug.Log("Start Test" + TestCount);
DateTime startTime;
DateTime endTime;
startTime = System.DateTime.Now;
for (int i = 0; i < TestCount; i++)
{
GetComponent<Test>();
}
endTime = System.DateTime.Now;

Debug.Log("GetComponent<>()----------" + (endTime - startTime).TotalMilliseconds + " MS");

startTime = System.DateTime.Now;
for (int i = 0; i < TestCount; i++)
{
GetComponent(typeof(Test));
}
endTime = System.DateTime.Now;

Debug.Log("GetComponent(typeof())----------" + (endTime - startTime).TotalMilliseconds + " MS");

startTime = System.DateTime.Now;
for (int i = 0; i < TestCount; i++)
{
GetComponent("Test");
}
endTime = System.DateTime.Now;

Debug.Log("GetComponent(test)----------" + (endTime - startTime).TotalMilliseconds + " MS");
}

`

测试量: 100000

测试结果1:

没有Test这个class的情况:

有Test这个class的情况:

这个情况你会发现最好的是string的情况,其次是typeof,最后才是<>

测试结果2:

有这个Testclass的情况:

这个情况最好的是GetCompoent<>,其次是typeof(T)最后是string

感觉不是很对劲,为什么有test的类和没有相差那么大

分析profile(单独运行一个一个测试产生)发现问题所在:

它产生了很多GC,实际上,发现当GetCompoent<>或者typeof(T)找不到这个class的时候unity会生成一个null出来,这个就是会产生GC,查了挺久资料发现这个只是editor上才有,真机或者发布版本不会有;

所以猜测里面实现:

GetCompoent<>

typeof(T)

里面都是差不多的实现,内部存储是以type为key产生的一个map字典,GetCompoent<>需要转化为typeof(T)

至于这个className的方式猜测是需要把className转换成type,然后才可以get,效率就低很多,转换的可能是需要每次都查表转换。

如果自己本身做了缓存,这个效率也会比较快

打赏

扫一扫,分享到微信

微信分享二维码

请我喝杯咖啡吧~

支付宝
微信