cocos2d-x內存管理注意事項

一、基於Objective-C的內存管理方式;

二、過於零散的對象分配回收可能導致堆中的內存碎片化;

三、主要兩種實現智能管理內存的技術:引用計數和垃圾回收。引用計數通過每個對象維護自身的一個引用計數去記錄該對象當前被引用的次數,當引用計數爲0時,標識着該對象的生命週期結束,自動觸發對象的回收釋放,可有效解決內存釋放問題,但依然存在堆碎片化和管理繁瑣的問題;垃圾回收:一種自動的內存回收器,自動跟蹤每一個對象的所有應用,在不可預知的情況下對內存堆中已經死亡的或者長時間沒有使用過的對象進行清除和回收,程序員不能手動指派垃圾回收其回收謀個對象。cocos2d-x使用引用計數方法。

四、方法autorelease(),其作用是將對象放入自動回收池CCAutoreleasePool。當回收池自身被釋放的時候,它就會對池中的所有對象執行一次release()方法。引擎在每次遊戲循環開始之前會創建一個回收池,在循環結束後釋放回收池。因此,即使沒有手工創建和釋放回收池,每一幀結束的時候,自動回收池中的對象也都會被執行一次release()方法。調用了autorelease()方法的對象將會在自動回收池釋放的時候被釋放一次。自動回收池是可以嵌套的。多個自動回收池排列成棧結構,當手動創建了回收池之後,回收池會壓入棧的頂端,autorelease對象僅添加到頂端的回收池中。當頂層的回收池被彈出釋放時,它內部所有的對象都會被釋放一次,此後出現的autorelease()對象則會添加到下一個池中。

五、通常,cocos2d-x會在每一幀之間釋放一次自動回收池;

六、autorelease方法是將對象標識爲在每一幀之間釋放release()一次對象的引用,即引用計數減1。只有對象的引用計數爲0時,對象纔會自動釋放掉。所以要確保的是對象的引用計數準確。當調用retain()來獲取對象的引用權時,需要手動去release對象的引用。

七、autorelease()的垃圾池機制同樣地需要佔用內存和cpu資源,每次執行rutorelease()的過程,實際上對應的是執行成對的retain()和release(),以及一次成對的容器存取,愛包括其他的邏輯判斷。過多不必要的autorelease()將導致垃圾池膨脹,佔用很大內存。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章