我所理解的cocos2dx - cocos2dx架構一憋(上)

cocos2dx引擎總覽node

  

 

  遊戲引擎是什麼?最簡單的遊戲引擎自己就是一個渲染系統而已,它調用底層各種的api,來幫助開發者進行渲染。cocos2dx也是如此,它最主要的功能就是提供很是方便使用的渲染機制,而且是跨平臺的,這對於開發者來講就十分的喜歡了。c++

  除此之外,cocos2dx經過使用第三方庫來支持許多遊戲開發中須要用到的功能,例如文件解壓,圖片解析,網絡支持,物理引擎,音頻等功能,讓開發者能夠更專一於渲染引擎的開發。而且還封裝了和平臺無關的接口:文件加載,紋理解析,線程操做等。程序員

  cocos2dx核心部分是構建了場景中元素的層級結構,關係和元素的管理遍歷繪製。帶有優秀的動畫系統,最後還有支持不少第三方工具,例如骨骼動畫製做,紋理拼接,網格地圖等。首推是cocosstudio,集成了場景編輯,動畫設計,粒子效果,骨骼等大部分功能。api

 

cocos2dx內存管理機制安全

c++顯式堆內存管理網絡

  這引擎的內存管理機制是源於object-c的,瞭解以前得了解c++的管理方式:函數

  c++使用new分配內存,delete釋放內存,雖然看起來方便,卻沒法徹底保證此應用正確。不能正確處理的話會出現幾個問題:工具

    1.野指針:指向的內存已被釋放,卻還有其餘指向它的指針還在使用性能

    2.重複釋放動畫

    3.內存泄漏:再也不使用的內存沒有釋放,致使內存佔用太高

 

c++11中的智能指針

  c++11加入智能指針,對*進行了重載,因此能夠經過*ptr訪問到其所分配的堆內存,經過調用reset成員釋放其內存:

    1.unique_ptr:不能和其餘智能指針共享其指向的內存,直接賦值給其餘指針會報錯,但能夠經過標準庫的move來轉移,一但轉移,原來的指針會失效

    2.shared_ptr:多個共享,採用引用計數,reset只會引用-1

    3.weak_ptr:指向shared_ptr指針的內存,但不擁有它,咱們經過lock方法來訪問其指向的shared_ptr對象,若是指向對象失效,返回nullptr(就是弱引用啊斌!)

 

爲何不使用智能指針 

  但cocos2dx不使用智能指針,緣由:

    1.性能損失,shared_ptr線程安全,自帶互斥鎖

    2.仍要顯示聲明指針,不優雅

 

垃圾回收機制  

  垃圾回收機制,通常經過:

    1.引用計數:實現簡單

    2.跟蹤處理:以目標爲根,在其引用的空間上作標記,完成後沒標記的在第二階段清理

 

cocos2dx內存管理機制

  引擎使用的是一個可稱爲智能指針的變體

class Ref:
    def retain():pass
    def release():pass
    def autorelease():pass
    def getRefreenceCount():pass
    self._referenceCount = 0
    #friend class AutoreleasePool

  retain增長引用,release減小引用,但不多直接使用它們來管理,否則就和c++的同樣了。咱們知道,智能指針是通關關聯一個自動變量來實現,autorelese其實就是大概作相似的工做,調用它的時候,它會聲明對象爲智能指針,但它不關聯自動變量,而和加入一個AutoreleasePool裏,這個池在每一幀結束對池裏對象進行清理

  實現機制是,AutoReleasePool對池裏對象release一下,若是沒被使用,引用會爲0,則後面被釋放。

  

auto node = new Node()
node->autorelease()
#幀結束後被釋放

auto node = new Node()
node->autorelease()
addChild(node)
#不會被釋放

  cocos2dx爲了避免用顯式調用AutoRelease,通常讓程序員經過create來獲取對象,而create裏幫咱們調用好了AutoRelease。autorelease主要應用在ui元素上。

 

autoreleasepool隊列

  爲了支持對自定義數據對象的自動釋放的支持,咱們須要可以自定義AutoreleasePool的生命週期,引擎是經過一個pool隊列來處理它,而且交由PoolManager來管理,裏面至少有一個pool來處理ui元素的問題。咱們能本身建立一個,爲了達到和智能指針同樣的內存管理,AutoreleasePool的構造和析構函數進行了特殊處理:把自己加進本身的池裏,當執行clear的時候,就會對自己進行release,從而達到管理本身的工做。

 

cocos2dx中的智能指針

  http://blog.csdn.net/sundaboke/article/details/40044855

相關文章
相關標籤/搜索