¥尽量避免每帧处理
1)方案一:每隔几帧处理一次
function Update() { if(Time.frameCount % 5 == 0) { DoSomeThing(); } }
2)方案二:定时重复处理用InvokeRepeating 函数实现
function Start() { InvokeRepeating("DoSomeThing", 0.5, 1.0); }
¥优化 Update,FixedUpdate, LateUpdate 等每帧处理的函数,函数里面的变量尽量在头部声明
private var pos: Vector3; function Update(){ pos = transform.position; }
¥可用变量缓存游戏对象或组件,避免频繁的FindGameObject()和GetComponent()
¥主动回收垃圾 function Update() { if(Time.frameCount % 50 == 0) { System.GC.Collect(); } }
¥循环语句中,可先保存最大值
length=myArray.Length; for(int i=0;i<length;i++) { }
¥少用foreach,因为每次foreach为产生一个enumerator(约16B的内存分配),尽量改为for.
¥将GameObject上不必要的脚本disable掉,避免每帧做update()操作
¥删除空的Update方法
¥Lambda表达式,使用不当会产生内存泄漏
¥尽量少用LINQ:1.部分功能无法在某些平台使用,2.会分配大量GC Allow.
¥控制StartCoroutine的次数:开启一个Coroutine(协程),至少分配37B的内存。Coroutine类的实例21B,Enumerator -- 16B
¥使用StringBuilder替代字符串直接连接.
¥缓存组件:每次GetComponent均会分配一定的GC Allow;每次Object.name都会分配39B的堆内存.
¥尽量使用固定的内置数组:内置数组是非常快的。ArrayList或Array类很容易使用,但速度不行