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]
相关文章推荐
- cocos2dx 3.x 内存管理总结
- cocos2dx 3.x内存管理源代码追踪
- cocos2dx 2.x与cocos2dx 3.x类库用法对比
- cocos2dx内存管理的一些看法
- cocos2dx 3.x截图功能实现
- cocos2dx 3.X 触摸吞噬功能
- cocos2dx-3.x 导入lua扩展库
- cocos2dx3.X 22中常用动作
- windows下cocos2dx 3.x编译安卓工程
- cocos2dx 3.x事件监听
- cocos2dx3.X创建项目
- cocos2dx 3.x中利用RenderTexture检测触摸点的alpha透明度的值
- cocos2dx多线程以及线程同步 与 cocos2dx内存管理与多线程问题
- 快速记录一下cocos2dx 3.x 全屏幕 blur 效果实现相关代码
- cocos2dx 3.x 之移植到android平台
- [Cocos2d塔防游戏开发]Cocos2dx-3.X完成塔防游戏《王国保卫战》--地图(一)
- cocos2dx 3.x win7+VS2012开发环境搭建及HelloWorld
- cocos2dx-3.x android虚拟机运行错误的问题
- cocos2dx 3.x 命令行创建和编译工程
- cocos2dx多线程以及线程同步 与 cocos2dx内存管理与多线程问题