您的位置:首页 > 移动开发 > Cocos引擎

cocos2dx 3.x内存管理

2017-02-21 16:51 429 查看

Cocos2dx 内存机制

CCDirector

[align=justify]主循环 每次清理内存池[/align]
[align=justify]void DisplayLinkDirector::mainLoop()[/align]
[align=justify]{[/align]
[align=justify]    if (_purgeDirectorInNextLoop)[/align]
[align=justify]    {[/align]
[align=justify]        _purgeDirectorInNextLoop = false;[/align]
[align=justify]        purgeDirector();[/align]
[align=justify]    }[/align]
[align=justify]    else if (! _invalid)[/align]
[align=justify]    {[/align]
[align=justify]        drawScene();[/align]
[align=justify]    [/align]
[align=justify]        // release the objects[/align]
[align=justify]        PoolManager::getInstance()->getCurrentPool()->clear();[/align]
[align=justify]    }[/align]
[align=justify]}[/align]

CCNode

[align=justify]继承自ccref,每次创建都会讲当前node加入自动回收池[/align]
[align=justify]Node * Node::create()[/align]
[align=justify]{[/align]
[align=justify]    Node * ret = new (std::nothrow) Node();[/align]
[align=justify]    if (ret && ret->init())[/align]
[align=justify]    {[/align]
[align=justify]        ret->autorelease();[/align]
[align=justify]    }[/align]
[align=justify]    else[/align]
[align=justify]    {[/align]
[align=justify]        CC_SAFE_DELETE(ret);[/align]
[align=justify]    }[/align]
[align=justify]    return ret;[/align]
[align=justify]}[/align]
[align=justify]当每一个节点从渲染树销毁的时候都会调动~node()方法,将单签node从内存池中清理掉[/align]

Node::~Node()

[align=justify]{[/align]
[align=justify]    CCLOGINFO( "deallocing Node: %p - tag: %i", this, _tag );[/align]
[align=justify]   [/align]
[align=justify]#if CC_ENABLE_SCRIPT_BINDING[/align]
[align=justify]    if (_updateScriptHandler)[/align]
[align=justify]    {[/align]
[align=justify]        ScriptEngineManager::getInstance()->getScriptEngine()->removeScriptHandler(_updateScriptHandler);[/align]
[align=justify]    }[/align]
[align=justify]#endif[/align]
[align=justify]    // User object has to be released before others, since userObject may have a weak reference of this node[/align]
[align=justify]    // It may invoke `node->stopAllAction();` while `_actionManager` is null if the next line is after `CC_SAFE_RELEASE_NULL(_actionManager)`.[/align]
[align=justify]    CC_SAFE_RELEASE_NULL(_userObject);[/align]
[align=justify]   [/align]
[align=justify]    // attributes[/align]
[align=justify]    CC_SAFE_RELEASE_NULL(_glProgramState);[/align]
[align=justify]    for (auto& child : _children)[/align]
[align=justify]    {[/align]
[align=justify]        child->_parent = nullptr;[/align]
[align=justify]    }[/align]
[align=justify]    removeAllComponents();[/align]
[align=justify]   [/align]
[align=justify]    CC_SAFE_DELETE(_componentContainer);[/align]
[align=justify]   [/align]
[align=justify]#if CC_USE_PHYSICS[/align]
[align=justify]    setPhysicsBody(nullptr);[/align]
[align=justify]#endif[/align]
[align=justify]   [/align]
[align=justify]    CC_SAFE_RELEASE_NULL(_actionManager);[/align]
[align=justify]    CC_SAFE_RELEASE_NULL(_scheduler);[/align]
[align=justify]   [/align]
[align=justify]    _eventDispatcher->removeEventListenersForTarget(this);[/align]
[align=justify]   [/align]
[align=justify]#if CC_NODE_DEBUG_VERIFY_EVENT_LISTENERS && COCOS2D_DEBUG > 0[/align]
[align=justify]    _eventDispatcher->debugCheckNodeHasNoEventListenersOnDestruction(this);[/align]
[align=justify]#endif[/align]
    CCASSERT(!_running, "Node still marked as running on node destruction! Was base class onExit() called in derived class
onExit() implementations?");
[align=justify]    CC_SAFE_RELEASE(_eventDispatcher);[/align]
[align=justify]}[/align]
[align=justify]清空内存池[/align]
[align=justify]void AutoreleasePool::clear()[/align]
[align=justify]{[/align]
[align=justify]#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)[/align]
[align=justify]    _isClearing = true;[/align]
[align=justify]#endif[/align]
[align=justify]    for (const auto &obj : _managedObjectArray)[/align]
[align=justify]    {[/align]
[align=justify]        obj->release();[/align]
[align=justify]    }[/align]
[align=justify]    _managedObjectArray.clear();[/align]
[align=justify]#if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)[/align]
[align=justify]    _isClearing = false;[/align]
[align=justify]#endif[/align]
[align=justify]}[/align]

CCRef

[align=justify]将当前对象加入内存池中[/align]
[align=justify]Ref* Ref::autorelease()[/align]
[align=justify]{[/align]
[align=justify]    PoolManager::getInstance()->getCurrentPool()->addObject(this);[/align]
[align=justify]    return this;[/align]
[align=justify]}[/align]
[align=justify]加入内存池具体的操作[/align]

CCAutoReleasePool

[align=justify]void AutoreleasePool::addObject(Ref* object)[/align]
[align=justify]{[/align]
[align=justify]    _managedObjectArray.push_back(object);[/align]
[align=justify]}[/align]
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

}

[align=justify]//回到CCDirector中进行垃圾回收[/align]
[align=justify]// release the objects[/align]
[align=justify] PoolManager::getInstance()->getCurrentPool()->clear();[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cocos2d-x 内存管理