(1)程序整体优化方面
A:我们要删除脚本中为空或者不需要的默认方法,尽量少在Update里面做事情,脚本不用时把它禁用掉(Deactive)
B:尽量不使用原生态的GUI方法,而是使用UGUI或者NGUI来代替
C:尽量的隐藏/显示或者实例化来回的切换对象,尽量少用SetActiveRecursively或Active,而是改为将对象移除相机范围和移回原位的做法,也可以选择使用脚本的方式开启与关闭游戏对象的“Mesh Renderer”组件来进行优化
D:不要频繁的获取组件,将其声明为全局变量
E:脚本不使用时禁用它,需要时再开启
F:尽量直接声明脚本变量,而不使用GetComponent来获取脚本
G:尽量少的使用Update、LateUpdate、FixedUpdate等每帧都处理的函数
H:使用C#中的委托与事件机制,比使用SendMessage机制效率更高
(2)事件函数方面
A:按照脚本生命周期的原理,对于“协程”与“调用函数”,一般在脚本禁用的时候,“协程”与调用函数,不会自动调用,需要使用脚本写明标识禁用,否者会出现空转现象,耗费资源
B:同一脚本中频繁使用的变量与脚本之间频繁调用的变量或方法,建议声明为全局的
C:尽量避免每帧处理,可以每隔几帧处理一次。
D:可以使用协同或者调用函数来代替不必每帧都执行的方法
E:避免在Update或者FixedUpdate中使用搜索方法
(3)数学计算方面
尽量使用int类型来代替float类型,尽量少用复杂的数学函数,改除法为乘法,尽量少用模运算和除法运算
(4)垃圾回收机制
A:尽量主动回收垃圾
B:垃圾回收的时机:尽量放在游戏场景的加载和场景结束的时候主动卸载资,在战斗中不要主动卸载,否者造成非连续性卡顿等
C:避免频繁分配内存:应该经常重复使用数组合其他对象,不能分配新的数组或对象,采用“游戏对象缓存技术”提高系统效率
D:在较大场景中,距离摄像机较远的游戏对象可以将GameObject上不必要的脚本禁用(Disable)掉,如果需要开启,则再使用GameObject.setctive()开启等,这样也可以配合事件中的OnBecameInvisible()(当变为不可见)和OnBecameVisible()(当变为可见)使得游戏对象在不可见的时候自动禁用,可见的时候再开启
E:善于使用OnBecameInvisible()和OnBecameVisible(),控制物体Update()函数的执行减少开销
F:资源预加载技术的运用。资源预加载技术就是以空间换取时间的方法,正式进入战斗场景前,可以在关卡之间的“战绩统计场景”中进行“预加载”操作(一般常用“协同”进行加载),这样游戏不会出现卡顿等现象