学习笔记Cocos2d-x之内存管理

内存管理

内存管理的核心是动态分配的对象必须保证在使用完毕后有效的释放内存,即管理对象的生命周期。

Cocos2d-x的内存管理机制

Cocos2d-x很巧妙地运用了前面的引用计数机制与自动回收的内存管理机制。为了实现对象的引用计数记录,Cocos2d-x实现了自己的根类CCObject,引擎中的所有类都派生自CCObject.

如:

class CC_DLL CCObject : public CCCopying
{
public:
//对象id,在脚本引擎中使用
unsigned int m_uID;
//Lua中的引用ID,同样被脚本引擎使用
int m_nLuaID;
protected:
//引用数量
unsigned int m_uReference;
//标识此对象是否已设置为autorelease
bool m_bManaged;
public:
CCObject(void);
virtual ~CCObject(void);
void release(void);
void retain(void);
CCObject* autorelease(void);
CCObject* copy(void);
bool isSingleRefrence(void);
unsigned int retainCount(void);
virtual bool isEqual(const CCObject* pObject);
virtual void update(ccTime dt) {CC_UNUSED_PARAM(dt);};
friend class CCAutoreleasePool;
};

每个对象包含一个用来控制生命周期的引用计数器,它就是CCObject的成员变量m_u-Reference。我们可以通过retainCount()方法获得对象当前的引用计数值。在对象通过构造函数创建时候,该引用值被赋为1,表示对象由创建者所引用。在其他地方需要引用对象时,我们会调用retain()方法,令其引用计数增1,表示获取该对象的引用权;在引用结束的时候调用release()方法,令其引用计数值减1,表示释放该对象的引用权。

autorelease(),其作用是将对象放入自动回收池(CCAutore- leasePool)。当回收池自身被释放的时候,它就会对池中的所有对象执行一次release()方法,实现灵活的垃圾回收。回收池可以手动创建和释放。除此之外,引擎在每次游戏循环开始之前也会创建一个回收池,在循环结束后释放回收池。因此,即使我们没有手工创建和释放回收池,每一帧结束的时候,自动回收池中的对象也都会被执行一次release()方法。

调试:在vs2013中的debug状况下使用F5调试

Sprite *fish = new Sprite();
fish->init();
CCLOG("retainCount after init:%d",fish->getReferenceCount());
fish->retain();
CCLOG("retainCount after retain:%d",fish->getReferenceCount());
fish->release();
CCLOG("retainCount after release:%d",fish->getReferenceCount());
fish->autorelease();
CCLOG("retainCount after autorelease :%d",fish->getReferenceCount());

输出结果是:


创建回收池:

回收池管理器CCPoolManager的push()或pop()方法可用来创建或释放回收池。其中CCPoolManager也是一个单例对象。

相关文章

    本文实践自 RayWenderlich、Ali Hafizji 的文章《...
Cocos-code-ide使用入门学习地点:杭州滨江邮箱:appdevzw@1...
第一次開始用手游引擎挺激动!!!进入正题。下载资源1:从C...
    Cocos2d-x是一款强大的基于OpenGLES的跨平台游戏开发...
1.  来源 QuickV3sample项目中的2048样例游戏,以及最近《...
   Cocos2d-x3.x已经支持使用CMake来进行构建了,这里尝试...