Cocos2d-x 内存管理基本原理(引用计数)

Cocos2d-x 使用的是引用计数的方式来实现C++的内存回收,Cocos2d-x 引用计数的基类是Ref。

PoolManager是个单例,里面有个AutoreleasePool实例,在AutoreleasePool创建时,
就会调用PoolManager::getInstance()->push(this);

PoolManager* PoolManager::getInstance()
{
    if (s_singleInstance == nullptr)
    {
        s_singleInstance = new (std::nothrow) PoolManager();
        // Add the first auto release pool
        new AutoreleasePool("cocos2d autorelease pool");
    }
    return s_singleInstance;
}
AutoreleasePool::AutoreleasePool(const std::string &name)
: _name(name)
#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
, _isClearing(false)
#endif
{
    _managedObjectArray.reserve(150);
    PoolManager::getInstance()->push(this);
}

Ref::autorelease()一般是在Node节点创建(_referenceCount默认为1)的时候调用此方法,将其放在AutoreleasePool里面,当Node被添加到父节点的时候(addChild),就会调用retain(_referenceCount++)方法。

Cocos2d-x的主线程Director:mainLoop [↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓]

void Director::mainLoop()
{
   ......此处省略代码
    else if (! _invalid)
    {
        drawScene();
        // release the objects
        PoolManager::getInstance()->getCurrentPool()->clear();
    }
}

大家注意看到PoolManager::getInstance()->getCurrentPool()->clear();
每当coco2d-x主线程调用一次的时候统一调用一遍被放入AutoreleasePool的所有元素的release(),移除引用计数_referenceCount为0的元素。也就是说你创建了一个Node 或是Sprite,如果你不调用add到父节点上,或是不调用retain,下一帧的mainLoop就会被AutoreleasePoo回收掉,所有对于自己创建的节点或是自定义的Ref子类,需要自己retain 和release。

你可能感兴趣的:(Cocos2d-x 内存管理基本原理(引用计数))