cocos2dx的記憶體管理方式

2021-10-25 10:21:43 字數 1705 閱讀 8928

cocos是通過引用計數方式管理記憶體,主要通過兩種方式實現

當我們建立乙個例項時,基類ref裡面有乙個叫referencecount的引數就會置1,它代表我們引用的次數,使用retain()函式

可以使referncecount+1,release()函式會使referencecount-1,當這個引數減至0時會被引擎delete掉釋放記憶體

有手動就會有自動。我們在create()乙個物件時,呼叫new函式建立物件並且還會利用autorelease()方法把該物件的指標加入自動**池

在mainloop()方法中會利用單例的poolmanager類getcurpool()獲取當前的自動**池,並呼叫自動**池中的clear()方法,

clear()方法裡,會遍歷移除所有與該自動**池相關聯的物件,並呼叫一次release()方法,如果這個物件沒被呼叫且referencecount被減至0就會被delete掉。若這個物件已經addchild到其他控制項上唄引用的話,則referencecount不為0,等其父節點被清理時再**

好處:

1.無需手動的release()和retain(),避免記憶體洩漏。

2.在每一幀結束後對無用的物件進行自動處理記憶體**,方便可靠。

可優化的地方:

1.我們的poolmanager管理的是乙個_releasepoolstack(儲存自動**池的棧),一般情況下,每一幀結束後我們只是把當前的池子給清空,然後執行下一幀的操作。但是我們也應該考慮到釋放池本身維護著乙個將要執行釋放操作的物件列表,如果在一幀之內生成了大量的autorelease物件,將會導致釋放池效能下降。因此,在生成autorelease物件密集的區域(通常是迴圈中)的前後,我們最好可以手動建立並釋放乙個**池。

2.autorelease()只有在自動釋放池被釋放時才會進行一次釋放操作,如果物件釋放的次數超過了應有的次數,則這個錯誤在呼叫autorelease()時並不會被發現,只有當自動釋放池被釋放時(通常也就是遊戲的每一幀結束時),遊戲才會崩潰。在這種情況下,定位錯誤就變得十分困難了。因此,我們建議在開發過程中應該避免濫用autorelease(),只在工廠方法等不得不用的情況下使用,盡量以release()來釋放物件引用。

cocos2dx 記憶體管理

記憶體管理中經常遇到的問題 記憶體洩露,記憶體溢位。在cocos2dx中用的是引用計數和自動釋放池的技術,由於熟悉objective c語言,所以對這兩個概念不會很陌生。一 引用計數 引用計數是自動記憶體管理的基礎 在物件裡增加乙個引用計數,當外部引用增加時,計數器加1,當外部引用消失時,計數器減1...

cocos2d x 記憶體管理

呼叫了autorelease的物件,將會在自動 池釋放的時候被釋放一次。因為這個操作發生在 mainloop drawscene 後,這時候遊戲中所有的邏輯已經執行完畢,正是釋放無效資源的最佳時機。所以乙個物件被create後,將被放進pool中,其ref 數為1,當遊戲整個邏輯跑完,如果沒有增加r...

cocos2dx 記憶體管理

我們知道,cocos2dx中使用了引用計數的方式去管理記憶體,不需要我們手動delete的去釋放記憶體。那麼cocos2dx中是怎麼實現引用計數的記憶體管理方式的呢?cocos2dx中的記憶體管理用到了兩個工具 引用計數器 ref 自動 池 autoreleasepool 引用計數器 ref ref...