Unity 3D中C#的性能优化小陷阱
本篇内容主要来自Unity官方手册:
一些地方为本人瞎编杜撰,请酌情参考。如有错误,欢迎指出。
一般性能优化
Unity里C#编程虽然既简单还很爽,但是性能小陷阱还不少。我总强迫自己让代码最优,因此很留意这些细节。这里我记录了一下最近发现的一下优化点。
协程 别嵌套
协程( Coroutine )固然爽,我用起来可得心应手了,刷刷刷,平滑动画,等待加载,定时启动……
官方的意见是:
- 在可能的情况下,最好将一系列操作压缩到尽可能少协程。虽然嵌套协程非常适合代码清晰度和维护,但由于协程跟踪对象,它们会产生更高的内存开销。
- 如果一个协同程序几乎每帧都运行并且在长时间运行的操作中不会新产生,那么用一个
Update
或者LateUpdate
回调替换它通常更具可读性。对于长期运行或无限循环的协同程序尤其如此。
object == null 很昂贵
UnityEngine.Object子类的实例与null进行比较的成本比与纯C#类的比较要昂贵得多。因此,请避免在紧密循环或每帧运行的代码中进行这些空比较。
颜色字符串转换用ColorUtility
对于HTML格式的颜色字符串(#RRGGBBAA
)到Unity内Color的转换,比起自己写代码,内置的ColorUtility API 更好,内存分配更少。
数据结构自带的常量并不会节约GC
这个我也挺迷惑的。数据结构自带的常量其实是属性里写好的返回值。
例如Vector3.zero的属性体为:get { return new Vector3(0,0,0); }
因此 Vector3.zero 并不会比 new Vector3(0,0,0) 更快。
Find和FindObjectOfType很慢
随着场景物体增加,这个方法只会越来越慢。
Camera.main 实际上用的类似的方式( FindObjectWithTag ),要用的话还是先缓存一个变量。
其他的之后想起再补充……
还有一些代码快了,人也苦了的优化点
交错数组更快?
一般的多维数组是:int[ , ] arrray = new int[x, y];
交错数组是像这样:int[][] arrray = new int[x][ ];
此外,多维数组据用array.length 获取全部元素数量,array.Get Length(0)获取某个维度的长度,而交错数组则通过array.length 获取第一维长度,array[0].length获取下一维某元素的长度。
理论上多维数组应该更快,但是按照编译结果,交错数组反而快不少。(说明)
虽然交错数组是可能是快些,不过很多情况下会让代码很绕人(例如上面获取长度的解释你看懂了吗 : D ),所以要使用还要权衡一下。
方法调用能少就少
所有语言通用,但是没有方法的代码是没有灵魂的。