我理解中的cocos2dx之Ref

Ref也就是以前的CCObject,是所有cocos2dx节点的终极父类,由它来进行内存的管理

它主要有以下函数retain()、release()、autorelease()、及引用计数变量_referenceCount和友元类内存池AutoreleasePool


在2dx中,内存管理就是靠引用计数_referenceCount来管理

void Ref::retain()
{
    CCASSERT(_referenceCount > 0, "reference count should greater than 0");
    ++_referenceCount;
}

void Ref::release()
{
    CCASSERT(_referenceCount > 0, "reference count should greater than 0");
    --_referenceCount;

    if (_referenceCount == 0)
    {
#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
        auto poolManager = PoolManager::getInstance();
        if (!poolManager->getCurrentPool()->isClearing() && poolManager->isObjectInPools(this))
        {
            CCASSERT(false, "The reference shouldn't be 0 because it is still in autorelease pool.");
        }
#endif

#if CC_REF_LEAK_DETECTION
        untrackRef(this);
#endif
        delete this;
    }
}
可以看出,retain()时_referenceCount加1、release()时减1,当计数为0时,释放自己!

Ref* Ref::autorelease()
{
    PoolManager::getInstance()->getCurrentPool()->addObject(this);
    return this;
}
autorelease()则是把自身放入内存池中,有内存池来处理,跟进去看看

void AutoreleasePool::addObject(Ref* object)
{
    _managedObjectArray.push_back(object);
}
把对象放入容器中。那什么时候处理掉这个容器呢!

我们都知道,2dx它在工作时运行着一个大循环,这个循环中处理着图片的绘制,定时器,按钮点击事件等等,也在这个循环中,对无用内存进行释放!

在mian.cpp中开始

Application::getInstance()->run()
......
while(!glview->windowShouldClose())
    {
        QueryPerformanceCounter(&nNow);
        if (nNow.QuadPart - nLast.QuadPart > _animationInterval.QuadPart)
        {
            nLast.QuadPart = nNow.QuadPart - (nNow.QuadPart % _animationInterval.QuadPart);
            
            director->mainLoop();
            glview->pollEvents();
        }
        else
        {
            Sleep(1);
        }
    }
.....
mainLoop()函数

void DisplayLinkDirector::mainLoop()
{
    if (_purgeDirectorInNextLoop)
    {
        _purgeDirectorInNextLoop = false;
        purgeDirector();
    }
    else if (! _invalid)
    {
        drawScene();
     
        // 就是在这处理的
        PoolManager::getInstance()->getCurrentPool()->clear();
    }
}
在跟clear()函数

void AutoreleasePool::clear()
{
#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
    _isClearing = true;
#endif
    for (const auto &obj : _managedObjectArray)
    {
        obj->release();
    }
    _managedObjectArray.clear();
#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
    _isClearing = false;
#endif
}
其中的obj->release();也就是上面Ref的release()函数,当引用计数为0时释放,也就是2dx的内存管理机制!!!






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值