关于Unity3d程序方面的细节及优化
(基于移动开发)
1、每次创建的脚本对于用不到的Start(),.Update()函数都可以删除掉,尤其后者,即使什么都不做也会在更新。
2、不要做复杂的数学运算,比如开方运算Mathf.Sqrt()等,当我们求两个对象的距离的时候,可以直接自己计算求开方根上一级的运算。求三角函数也算复杂运算。
3、如果使用的Mono编辑器,在注释的时候,尽量采用英文注释(防止中文乱码)
4、Unity的每个component都在更新,脚本也算组件,所以一个对象不同的脚本,功能相近的可以放在一个脚本里,减少脚本组件。
5、有些组件没必要每帧都查找,拷贝,索引,完全可以自定义组件缓存,在代码开始的时候,比如transform....,GameObject.Find.....等,可以建立一个缓存或则缓存组,放在Start()函数里面。所以要谨慎的使用Unity API
6、一个脚本的编译顺序,Awake()——Start()——FixedUpdate()——Update()——LateUpdate(),对于这种顺序,要决定事情的顺序,比如生成对象,和查找对象的组件,这个时候,就要先生成在查找。
7、项目可以每到一个阶段,用性能检测器检查下性能,看看哪里需要修改,提前修改可以减少后期的优化。
8、Struct比class运行的更快。前者处于stack,后者处于heap。
9 多采用静态类型,可以提高速度。
10、在FixedUpdate()里处理物体更新的时候,对于非动作类游戏,或则没必要每帧都要更新,可以多帧更新一次。Time.framCount % 10......
11、For循环比foreach循环好用。
12、Int 比float 好,所以没必要所有数据都采用float。根据实际情况采用。
13、没有必要的字符串连接,尽量移除掉,也可以整合成一个字符串,否则会留下大量的内存垃圾。大概4个连接字符串就比一个字符串多出1kb内存垃圾。
14、If(go.CompareTag(“”))比if(go.tag==””)好,原理在与CompareTag匹配一地个字符串不相同的时候就会立刻返回false结果。
15、使用细节层次,关闭不再所感受到的功能。例如,将远处的敌人AI关闭,远去的时候,物理碰撞机也可以关闭,粒子系统也可以关闭。即最能提高性能的办法就是什么都不做。
16、最小化碰撞检测,列如ray cast,尽量从每次检查中获得更多的信息。
17、减少角色控制器移动命令的调用,可以缓存每帧的移动请求。
18、类似获取数组和数组列表的长度,应该在初始的时候获取长度,不要在更新函数里循环计算他的长度。
19、减少临时变量的使用,每次更新都会分配空间。
20、不要轻易改变公有数组的名字。
21、OnBecameVisible()当可见的时候,调用这个函数;
OnBecameInvisible()当相机不可见的时候调用这个函数;可用与一些特效等独立物体的代码。
22、关于组件查找,最好放在Awake()函数里,或则放在Start()函数最开头的位置,防止出现找不到相应组件,这是代码顺序造成的结果。
23、关于GUI.matrix矩阵来控制GUI分辨率适应,ui不能使用Screen自带宽高来控制,使用绝对尺寸才有效。