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


cocos2dx引擎總覽

  

 

  游戲引擎是什么?最簡單的游戲引擎本身就是一個渲染系統而已,它調用底層各類的api,來幫助開發者進行渲染。cocos2dx也是如此,它最主要的功能就是提供非常方便使用的渲染機制,並且是跨平台的,這對於開發者來說就十分的喜歡了。

  除此以外,cocos2dx通過使用第三方庫來支持許多游戲開發中需要用到的功能,例如文件解壓,圖片解析,網絡支持,物理引擎,音頻等功能,讓開發者可以更專注於渲染引擎的開發。並且還封裝了和平台無關的接口:文件加載,紋理解析,線程操作等。

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

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM