¥儘量避免每幀處理
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類很容易使用,但速度不行