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中的智能指针