cocos2dx源码分析:内存管理AutoreleasePool

cocos2dx中,AutoreleasePool只有一个作用,释放上一帧创建的没有被引用的对象。这通过clear函数实现

void AutoreleasePool::clear()
{
#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
    _isClearing = true;
#endif
    std::vector<Ref*> releasings;
    releasings.swap(_managedObjectArray);
    for (const auto &obj : releasings)
    {
        obj->release();
    }
#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
    _isClearing = false;
#endif
}

这里递减对象的引用计数,因为对象创建时引用计数就是1,如果没有任何对象引用它,那么递减引用计数后就会变成0,而引用计数为0时会删除这个对象。
这个函数会在每一帧中调用

void DisplayLinkDirector::mainLoop()
{
    if (_purgeDirectorInNextLoop)
    {
        _purgeDirectorInNextLoop = false;
        purgeDirector();
    }
    else if (_restartDirectorInNextLoop)
    {
        _restartDirectorInNextLoop = false;
        restartDirector();
    }
    else if (! _invalid)
    {
        drawScene();

        // release the objects
        PoolManager::getInstance()->getCurrentPool()->clear();
    }
}

PoolManager可以有多个AutoreleasePool,按先进后出的栈结构存储,操作的当前AutoreleasePool总是在栈顶

你可能感兴趣的:(cocos2d-x)