当前位置 : 主页 > 手机开发 > 其它 >

cocos2dx 3.x内存管理

来源:互联网 收集:自由互联 发布时间:2021-06-13
Cocos2dx 内存机制 CCDirector 主循环 每次清理内存池 void DisplayLinkDirector::mainLoop() { if (_purgeDirectorInNextLoop) { _purgeDirectorInNextLoop = false; purgeDirector(); } else if (! _invalid) { drawScene(); // release the

Cocos2dx 内存机制

CCDirector

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

CCNode

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

Node::~Node()

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

CCRef

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

CCAutoReleasePool

void AutoreleasePool::addObject(Ref* object) {     _managedObjectArray.push_back(object); } 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
}
//回到CCDirector中进行垃圾回收 // release the objects  PoolManager::getInstance()->getCurrentPool()->clear();
网友评论