1.內存泄漏
在最近的項目中使用了C11的智能指針。經過壹年的使用,證明這是壹個成功的選擇。雖然沒有自我管理的焦慮,但它增加了內存泄漏的機會。畢竟不是每個人都能完全理解和掌握shared_ptr的使用方法。建議使用cocos2dx自帶的輕量級智能指針,采用引用計數,不存在C11的智能指針循環引用等容易導致引用計數異常的問題。
2.緩存(材質緩存、向導幀緩存)管理
有必要為removeunused的緩存引入壹個過渡場景,然後預加載下壹個場景所需的資源。cocos2dx提供了壹個api來查看內存中的所有緩存。作為開發人員,我們必須完全熟悉內存中的這些緩存,並能夠及時判斷哪些材料是冗余的。
這裏還要提壹點,安卓用pkm,ios用pvr代替jpg是非常必要的。尤其是8000*8000的超大地圖。
3.高性能對象池
傳統對象池只有壹個保存所有對象的列表,每次都使用循環遍歷來查找未使用的對象。
這裏的優化是添加壹個隊列來存儲所有可用的對象。每次使用對象時都會執行Push_front,每次使用都是通過pop_front獲得的。
2.CPU優化
1.近似數學函數
平方根、三角函數近似替換算法、計算兩點之間的距離(曼哈頓距離、牛頓叠代或與平方值比較)、位移運算(用於頻繁的2的n次方乘除運算)等。
2.算法
事實上,算法的選擇滲透在每個功能模塊中,即使它很小。對於我們這些不是專門研究算法的人來說,算法更多的是壹種意識。拒絕所有時間復雜度為O(n * n)的操作,永遠不要高估CPU的計算性能,在現有操作上爭取更低的計算量。然後選擇適合自己項目的算法。
框架
框架是壹種不好的情況,因為優化可能在最後。確實有壹些cpu密集型計算需要進行成幀甚至線程化。
PS:空間換時間。其實以上三篇文章,包括我的高性能高斯模糊算法,基本都是針對cpu的優化,是以空間換時間。
3.GPU優化(繪圖調用優化)
1.超大型圖的切片
太小的切片對drawcall有很大影響。目前使用最大化切片2048*2048,圖片以壓縮格式存儲在緩存中。
2.組合(多攝像機場景)
對於有許多相機的場景,因為底層是壹個遍歷相機,每個相機執行壹次場景的所有繪制。
因此,在組合圖片時需要根據相機對圖片進行分層組合,不要將不同相機的圖片組合在壹起。
作為發展,我們應該能夠根據我們看到的場景估計drawcalls的數量,並在判斷異常時逐步優化不同級別的drawcalls數量。