zhishu520 / blog

一个关于游戏开发的博客(*^__^*)
3 stars 0 forks source link

cocos2dx 引用计数机制 #2

Open zhishu520 opened 5 years ago

zhishu520 commented 5 years ago

引用计数类 Ref


// 创建时候为1
Ref::Ref()
: _referenceCount(1) 
{

}

// 被 addChild 的时候会调用retain, 引用计数 +1
void Ref::retain()
{
    ++_referenceCount;
}

// 被 remove 的时候会调用release, 引用计数 -1
// 引用计数为0 的时候释放对象
void Ref::release()
{
    --_referenceCount;

    if (_referenceCount == 0)
    {
        delete this;
    }
}

OK, 原理就是这样了,引用计数为0的时候就会释放,但是还有两个疑问:

别急,请往下看!

对象缓存池

// 创建时调用,加入缓存池
Ref* Ref::autorelease()
{
    PoolManager::getInstance()->getCurrentPool()->addObject(this);
    return this;
}

// 主循环,下一帧时释放
void Director::mainLoop()
{
    // XXXX
    {
        drawScene();

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

// swap 圈起来,重点, vector clear是无法释放掉已经分配的内存的,swap可以。
void AutoreleasePool::clear()
{
    std::vector<Ref*> releasings;
    releasings.swap(_managedObjectArray);
    for (const auto &obj : releasings)
    {
        obj->release();
    }
}

这样的话下一帧的时候就会自动把引用计数为1的都给释放掉了。