---恢復內容開始---正則表達式
Unity的mono虛擬機佔用的是堆內存,應該也是使用了內存池之類的機制,釋放掉對象,堆內存是不會被釋放的。因此要管理好堆內存,省得堆內存暴漲首先就把手機撐爆了。緩存
首當其衝的是內存泄露,無用的資源始終佔據着內存,須要用的時候又初始化實例,致使內存沒法釋放,佔用的內存持續升高。閉包
其次,高頻率的實例化對象又釋放對象,會看到GC一直很高。高GC會佔用大量的CPU資源,致使遊戲卡頓。spa
我會整理記錄遇到的一些容易被忽視的,或者隱藏較深的問題。3d
1.Debug.Log會在各類模式下運行,雖然不會真的打印出來。當前的解決方案是,多封裝了一層,用宏來控制只調用空方法體。code
2.另一個廣泛的協程的錯誤是使用了new 當yield同一個值屢次,會形成高頻gc,而且高CPU消耗。當前的解決方案是,循環體的話,先實例化一個waitforseconds對象,而後yield之。協程
此外,咱們本身寫了一個單例Timer類(使用OnUpdate進行realTime計時,單次計時,屢次觸發,用委託將callback接口暴露出來。模仿LUA裏面的Timer類),用於實現定時刷新。對象
3.頻繁觸發的方法,裏面的實例化也應該作緩存。(好比消息體裏面的memorystream之類)blog
4.方法的引用,不管是匿名方法仍是命名方法,在Unity裏面都是引用類型,都將會致使堆內存的分配,將匿名方法轉變爲閉包(匿名方法使用了在建立的時刻的局部變量的地方),會顯著的增長內存的使用和堆內存的分配。so,委託的匿名寫法: callback += () =>{//body} 的寫法,若是要重複調用的,會形成GC,若是用了局部變量,還要形成額外的堆內存分配和使用,耍酷的同時是要付出代價的。接口
5.這個梗其實比較常識了。不過仍是順帶說一下。LINQ和正則表達式會有裝箱和拆箱操做,所以要儘可能避免使用。當前項目中是禁止使用LINQ和正則的。
//date to 2016-11-29