-
一,你是否还在代码里面直接使用transform呢?
-
不引用transform
- on click big loop count指的是我鼠标每次点击执行多少次外循环(当前外循环次数为100次),
- loop count是指内循环次数(当前内循环次数为10万次)。
- 平均每次测试时间指的是执行1次外循环,也就是执行10万次内循环所花费的时间(也就是下图中被鼠标框选的代码执行10万次的时间)
- 测试总时长除以已经测试的次数得到平均每次测试时间
-
可见不引用transform每次测试平均花费24.28ms
-
-
- 这是我的测试时间的代码,用的是stopwatch(图中的sw是指stopWatch sw = new())
-
-
-
引用transform
- 在start方法里面引用了trans=transform
-
-
-
- 下面我们使用trans每次将花费多少时间,如下图
-
花费16.08ms
-
总结,通过对比24.28ms和16.08ms可以得出预先将transform引用将会大大减少运算量。
-
二,选择合适的方法
- 这里我先把position的新位置存起来,再赋值给transform(注意要在start里面先把把物体的位置赋值给zanchun加上下图选中的代码,从此zanchun就相当于物体的位置)
-
- 如下图所示,每次只需要10.06毫秒
-
- 那么为什么会比刚刚的16.08ms还要少呢?我们把那个+=展开看看!
-
- 可以看到这一行代码在等号右边还进行了一次取trans.position的操作,一次这样的操作要比给zanchun赋值消耗大,所以使用zanchun来缓存trans的新位置可以减少一次"."操作达到减少消耗的目的。因此就出现了我们的10.06ms
-
总结,通过以上分析我们就知道了更新transform.position的较佳方式,先引用transform为trans,然后用zanchun代替transform.position的新位置,就能使原本24.28ms变为10.06ms了!其他的需要写在update里面的方法都可以考虑一下是否能够先引用,是否能减少一些"."操作,这些每一帧都需要执行的方法的优化感觉还有有点必要的。啥?客户叫我们优化一下性能?我们叫客户升级硬件设备!😈
- ps:本人第一次发文,也不是很懂,然后文中测试的时间可能有些误差但是大体是这样的!有任何问题可以直接提!批评改正都可以!最后附上代码,可以使用按钮button调用里面的showTime方法测试时间。
using System.Collections; using System.Collections.Generic; using System.Diagnostics; using UnityEngine; public class timeTest : MonoBehaviour { Stopwatch sw = new (); public int loopCount = 100000; public int onClickBigLoopCount = 1; public int 已经测试的次数; public double 平均每次测试时间, 测试总时长; public Transform trans; public Vector3 zanchun; public Vector3 Vspeed; public float vx, vy, moveSpeed; void Start() { trans = transform; zanchun = trans.position; } public void showTime()//写入你想要测试的方法 { for (int j = 0; j < onClickBigLoopCount; j++) { sw.Restart(); for (int i = 0; i < loopCount; i++) { zanchun+= Vspeed* Time.fixedDeltaTime; trans.position = zanchun; } sw.Stop(); 已经测试的次数++; 测试总时长 += sw.ElapsedMilliseconds; 平均每次测试时间 = 测试总时长 / 已经测试的次数; UnityEngine.Debug.Log(sw.ElapsedMilliseconds); } } }