前一篇我們講到cocos2d-x裡的記憶體管理機制,以及引擎中的自動記憶體管理機制。乙個被自動管理的物件從new出來之後到被放到autoreleasepool那麼接下來,物件是如何被引擎自動delete掉的呢?首先我們要知道,cocos2d-x的引擎執行緒是單執行緒的,它不停的呼叫voidccdisplaylinkdirector::mainloop(void)來繪製當前的scene ,同時對一些自動釋放的物件進行管理。我們先到乙個cocos2d-x專案的main()函式裡面:
這裡呼叫了乙個run()方法,我們跟蹤進去:
run方法有個while(1)迴圈,不斷的呼叫mainloop(void)方法,來完成介面渲染和物件釋放,我們進mainloop():
於是我們看到了引擎對自動管理的物件進行釋放的操作。它呼叫的,是ccpoolmanager的pop()方法,我們去看看這個pop()方法:
如**裡面所示,m_preleasepoolstack
就是之前提到的當前記憶體池,也就是記憶體池管理者裡面那個記憶體池堆疊的棧頂的那個記憶體池,對其進行clear()操作,記住,在clear()之前,被放置在自動管理池內的物件的引用次數都是為1的(依然只考慮物件被new出來之後馬上autorelease()操作並且在其他地方不進行retain()),那麼進行clear()操作時:
ccautoreleasepool會做這樣兩件事情,首先會把池中所有物件的被管理狀態置為false,表示物件已經不再處於自動管理狀態,然後清除管理池中所有的物件引用:
在這一過程中,會呼叫每個物件的release()方法,這樣,我們算一下,之前物件的引用次數為1,那麼在這裡進行一次release之後,引用為0,就會執行delete操作,這樣一來,這個被管理的物件就被成功釋放掉了。
下面我們來寫個小demo驗證一下這個過程:
new乙個物件:
s的引用次數為1,被管理狀態為false:
對其進行autorelease()
s的引用依然為1,被管理狀態為true:
然後進行一次retain()操作:
引用變為2
接下來刷下一幀,刷完後我們再看o物件,發現其被管理狀態變為false,引用變成1了,這說明如果我們之前沒有手動執行過retain(),這個物件已經被引擎給**掉了。
這樣一來,驗證了引擎的自動**機制,我們可以在retain()後面release()一次,來看看物件o被delete後的狀態:
發現其內部的資料都變成隨機數值了,也就是物件已經被清除了。
最後我來做個簡單的總結:
cocos2d-x中,採用引用計數的方式進行記憶體管理,誰需要引用這個物件,就對其retain()一次,同時在不需要它的時候,就要對其進行release()操作,這一點在引擎很多地方有示例,例如ccnode進行addchild()操作時,會對child進行retain()表示對其引用:
而在removechild()的時候會對其進行release()操作
第二點是物件的autorelease()操作,該操作的效果是物件在當前這一幀被new出來之後,在下一幀之前沒有被執行retain()(例如被add到某個ccmutablearray,或者被乙個父node作為子節點,也可以是我們手動retain()),那麼這個物件在下一幀就會被引擎給delete掉,那麼有時候出現的空指標錯誤,可能就**於此。還有的時候,是在自己手動retain()後放入autorelease池,這樣引擎只能將物件的引用減一,而不能delete掉,從而造成記憶體洩露。最後說一下,本人也是剛開始學習c++和cocos2d-x,寫這篇部落格與大家分享一下自己的心得,也是希望能幫到一部分對cocos2d記憶體管理有困惑的朋友,讓大家能共同學習進步,同時對我所講到的不合理的地方,希望各位大牛能夠指出,感謝閱讀!
Cocos2d x記憶體管理(二)
cocos2d x記憶體管理 二 前一篇我們講到cocos2d x裡的記憶體管理機制,以及引擎中的自動記憶體管理機制。乙個被自動管理的物件從new出來之後到被放到autoreleasepool那麼接下來,物件是如何被引擎自動delete掉的呢?首先我們要知道,cocos2d x的引擎執行緒是單執行緒...
cocos2d x 記憶體管理二
分類 學習筆記 2012 12 19 01 00 16人閱讀收藏 舉報 目錄 減少你的程式的大小 texturepacker png 優化 移除未使用的資源檔案 減少聲音檔案大小 streaming files 減少tilemap大小 就沒啦 全文如下 把紋理的顏色位深度減少到16位,不僅可以減少記...
Cocos2d x記憶體管理(二)
cocos2d x記憶體管理 二 前一篇我們講到cocos2d x裡的記憶體管理機制,以及引擎中的自動記憶體管理機制。乙個被自動管理的物件從new出來之後到被放到autoreleasepool那麼接下來,物件是如何被引擎自動delete掉的呢?首先我們要知道,cocos2d x的引擎執行緒是單執行緒...