避免內存泄漏,需要細心的去進行黑盒白盒檢查,壹般都是設計上的不合理造成的。同時可以善用 Destroy() 方法,強制釋放非托管內存。最好弄清楚 Unity 的資源管理機制,這方面網上教程很多,我就不做搬運工了。
減少內存分配,並不是說任何時候都不分配。在關卡進行時要將內存分配盡量減少,以降低 GC 的頻率。可以用 Profiler 找出是所有分配了內存的地方,再根據經驗判斷是否要進行優化。我以前粗略的整理過壹些會產生 GC 的操作,可供參考:
生成壹個新的委托,例如將方法做為參數傳入
對 List 進行 foreach
用枚舉做 Key 進行字典查找(可能是默認比較器 GetHashCode 時裝箱引起的,提供自定義的比較器應該能解決)
訪問 animation 等組件
獲取 SkinedMeshRenderer.bones 或 Mesh.uvs 之類的屬性
yield return 0 (建議全部替換為 yield return null)
調用 GetComponentInChildren(建議自己實現壹個無GC版本)