unity性能优化研究
发布时间
阅读量:
阅读量
一,你是否还在代码里面直接使用transform呢?
不引用transform
* on click big loop count指的是我鼠标每次点击执行多少次外循环(当前外循环次数为100次),
* loop count是指内循环次数(当前内循环次数为10万次)。
* 平均每次测试时间指的是执行1次外循环,也就是执行10万次内循环所花费的时间(也就是下图中被鼠标框选的代码执行10万次的时间)
* 测试总时长除以已经测试的次数得到平均每次测试时间

可见不引用transform每次测试平均花费24.28ms
-
-
- 这是我的测试时间的代码,用的是stopwatch(图中的sw是指stopWatch sw = new())

- 这是我的测试时间的代码,用的是stopwatch(图中的sw是指stopWatch sw = new())
-
-
引用transform
* 在start方法里面引用了trans=transform

-
-
- 下面我们使用trans每次将花费多少时间,如下图

- 下面我们使用trans每次将花费多少时间,如下图
-
花费16.08ms
总结,通过对比24.28ms和16.08ms可以得出预先将transform引用将会大大减少运算量。
二,选择合适的方法
* 这里我先把position的新位置存起来,再赋值给transform(注意要在start里面先把把物体的位置赋值给zanchun加上下图选中的代码,从此zanchun就相当于物体的位置)

-
- 如下图所示,每次只需要10.06毫秒

- 如下图所示,每次只需要10.06毫秒
-
- 那么为什么会比刚刚的16.08ms还要少呢?我们把那个+=展开看看!

- 那么为什么会比刚刚的16.08ms还要少呢?我们把那个+=展开看看!
-
- 可以看到这一行代码在等号右边还进行了一次取trans.position的操作,一次这样的操作要比给zanchun赋值消耗大,所以使用zanchun来缓存trans的新位置可以减少一次"."操作达到减少消耗的目的。因此就出现了我们的10.06ms
总结,通过以上分析我们就知道了更新transform.position的较佳方式,先引用transform为trans,然后用zanchun代替transform.position的新位置,就能使原本24.28ms变为10.06ms了!其他的需要写在update里面的方法都可以考虑一下是否能够先引用,是否能减少一些"."操作,这些每一帧都需要执行的方法的优化感觉还有有点必要的。啥?客户叫我们优化一下性能?我们叫客户升级硬件设备!😈
- ps:本人第一次发文,也不是很懂,然后文中测试的时间可能有些误差但是大体是这样的!有任何问题可以直接提!批评改正都可以!最后附上代码,可以使用按钮button调用里面的showTime方法测试时间。
1. using System.Collections;
2. using System.Collections.Generic;
3. using System.Diagnostics;
4. using UnityEngine;
5.
6. public class timeTest : MonoBehaviour
7. {
8. Stopwatch sw = new ();
9. public int loopCount = 100000;
10. public int onClickBigLoopCount = 1;
11. public int 已经测试的次数;
12. public double 平均每次测试时间, 测试总时长;
13. public Transform trans;
14. public Vector3 zanchun;
15. public Vector3 Vspeed;
16. public float vx, vy, moveSpeed;
17. void Start()
18. {
19. trans = transform;
20. zanchun = trans.position;
21. }
22. public void showTime()//写入你想要测试的方法
23. {
24. for (int j = 0; j < onClickBigLoopCount; j++)
25. {
26. sw.Restart();
27. for (int i = 0; i < loopCount; i++)
28. {
29. zanchun+= Vspeed* Time.fixedDeltaTime;
30. trans.position = zanchun;
31. }
32. sw.Stop();
33. 已经测试的次数++;
34. 测试总时长 += sw.ElapsedMilliseconds;
35. 平均每次测试时间 = 测试总时长 / 已经测试的次数;
36. UnityEngine.Debug.Log(sw.ElapsedMilliseconds);
37. }
38. }
39.
40. }
全部评论 (0)
还没有任何评论哟~
