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

前端之家收集整理的这篇文章主要介绍了学习笔记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也是一个单例对象。

猜你在找的Cocos2d-x相关文章