Cocos2dx筆記(3.x)

1. 內(nèi)存管理

Cocos2dx是通過引用計數(shù)方式管理內(nèi)存,主要通過兩種方式實現(xiàn)否纬。

1.1 手動內(nèi)存管理

手動retain和release

1.2 autorelease

創(chuàng)建一個對象后,可以使用autorelease()方法放入自動回收池,每一幀結(jié)束的時候自動release。函數(shù)調(diào)用關(guān)系為:

  • director->mainLoop()
  • PoolManager:getInstance->getCurrentPool->Clear()
  • obj->release()

問題:

  1. 發(fā)生時機在幀結(jié)束時期性含,release出錯難定位。
  2. 如果一幀創(chuàng)建大量對象鸳惯,會導(dǎo)致釋放池性能下降商蕴。

2. 渲染機制

Cocos2dx在每一幀進行一次渲染,mainloop()方法的drawScene()方法芝发,先清除渲染狀態(tài)绪商,然后調(diào)用_runningScene->render()方法。render()里使用visit()方法辅鲸,用sortAllChildren()(按LocalZOrder和OrderOfArrival排序)對子節(jié)點排序格郁,通過調(diào)用draw函數(shù),首先繪制LocalZOrder<0的節(jié)點独悴,在繪制自身例书,最后繪制LocalZOrder>0的節(jié)點。draw函數(shù)里面并沒有做實際的渲染工作刻炒,而是初始化渲染命令决采,添加到對應(yīng)的渲染隊列中。最后回到_runningScene->render()中執(zhí)行Renderer::render()方法落蝙。

Renderer::render()方法中织狐,對_renderGroups(_renderGroups是存儲RenderQueue的容器,RenderQueue類實質(zhì)是一個存儲了5種渲染命令的容器)里的每個渲染隊列執(zhí)行sort方法排序筏勒,根據(jù)其GlobalZorder從小到大進行排序,對GZOrder小于0的渲染命令旺嬉、GZOrder大于0的渲染命令按ZOrder從小到大進行排序管行。此時沒有對GZOrder等于0的渲染命令排序,因為這些渲染命令的添加是按照所屬的Node的LocalZOrder順序添加的邪媳,即已經(jīng)排好序捐顷,無需再次排序荡陷。

排序后執(zhí)行visitRenderQueue(_renderGroups[0])(),該方法是按隊列里命令分類的順序迅涮,依次對每個分類的每個命令執(zhí)行processRenderCommand方法废赞。

processRenderCommand方法遍歷隊列內(nèi)的每個分類,把命令加到容器中叮姑。在當前分類的命令都被遍歷之后唉地,執(zhí)行flush()方法,該方法主要是調(diào)用了drawBatchedTriangles()方法传透。

drawBatchedTriangles()會判斷批量渲染的條件是否成立耘沼,主要是比較當前命令材質(zhì)ID和上個命令材質(zhì)ID。

總結(jié)

渲染是在每幀結(jié)束前進行的朱盐;渲染之前是把每幀的所有元素的繪制用命令統(tǒng)一進行存儲群嗤,在渲染時讀取這些命令,進行繪制兵琳;渲染時還會進行批量繪制的判斷狂秘,這能有效降低DrawCall值。

3. 程序開始和結(jié)束

3.1 開始

AppDelegate::applicationDidFinishLaunching()里的runWithScene躯肌。

3.2 結(jié)束

mainloop里的_purgeDirectorInNextLoop判斷

3.2.1 _purgeDirectorInNextLoop何時改變

  • director調(diào)用end()函數(shù)者春。
  • popScene,無場景的時候也會調(diào)end羡榴。

3.2.2 purgeDirector()做了什么

  • 清理定時器
  • 回收當前場景
  • 銷毀緩沖區(qū)
  • 執(zhí)行g(shù)lView的end()函數(shù)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末碧查,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子校仑,更是在濱河造成了極大的恐慌忠售,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件迄沫,死亡現(xiàn)場離奇詭異稻扬,居然都是意外死亡,警方通過查閱死者的電腦和手機羊瘩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門泰佳,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人尘吗,你說我怎么就攤上這事腺毫×俦樱” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長淤击。 經(jīng)常有香客問我娘荡,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任觉渴,我火速辦了婚禮,結(jié)果婚禮上徽惋,老公的妹妹穿的比我還像新娘案淋。我一直安慰自己,他們只是感情好险绘,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布踢京。 她就那樣靜靜地躺著,像睡著了一般隆圆。 火紅的嫁衣襯著肌膚如雪漱挚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天渺氧,我揣著相機與錄音旨涝,去河邊找鬼。 笑死侣背,一個胖子當著我的面吹牛白华,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播贩耐,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼弧腥,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了潮太?” 一聲冷哼從身側(cè)響起管搪,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎铡买,沒想到半個月后更鲁,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡奇钞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年澡为,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片景埃。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡媒至,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出谷徙,到底是詐尸還是另有隱情拒啰,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布完慧,位于F島的核電站图呢,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏骗随。R本人自食惡果不足惜蛤织,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鸿染。 院中可真熱鬧指蚜,春花似錦、人聲如沸涨椒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蚕冬。三九已至免猾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間囤热,已是汗流浹背猎提。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留旁蔼,地道東北人锨苏。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像棺聊,于是被迫代替她去往敵國和親伞租。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內(nèi)容