转自:http://www.jb51.cc/article/p-nnyokbze-baa.html
一、题记
关于cocos2dx 的内存管理机制,想必大家都能清楚说出是通过引用计数(Reference Count)和自动释放池(AutoReleasePool)。但是不知大家是否知道其中具体的运行的细节呢?反正在写这篇blog之前我是一知半解的,而且在粗略的看了下PoolManager 的源码时我还开始怀疑过这个机制的可靠性,于是我还专门找了测内存泄漏的工具vs2010使用vld检测内存泄露,一测发现项目还真存在内存泄漏的问题。可是后来发现原来是自己用的别人的敏感字过滤开源库(https://github.com/xjdrew/crab)存在问题。经我改造后(https://github.com/xzben/GameFrame/tree/master/client/GameClient/frameworks/runtime-src/Classes/crab) 的版本修复此问题,并调整了api的结果。可是修复了我自己的代码的内存泄漏的问题后,发现 Cocos2dx 真的有内存泄漏(哈哈终于抓到尾巴了内心窃喜)。可是发现原来只是cocos2dx 一个单例模式的对象忘记了释放而已(这里我想吐槽cocos2dx 单例模式的实现,这里可以参考我之前写的一篇关于单例模式实现方式的博文http://www.jb51.cc/article/p-fnmodpjc-baa.html),并不是我想得PoolManager 导致的。终于发现原来cocos2dx 的内存管理模式其实应该 是 引用计数(Reference Count)和自动释放池(AutoReleasePool)和 内置CCVector和其它Cocos2dx内置容器类辅助实现的。下面来自己分析一下。
1、首先要说说我为什么怀疑它的可靠性。
因为我发现cocos2dx 的AutoReleasePool 其实是通过PoolManager 在每一帧调用一次clear
- voidDisplayLinkDirector::mainLoop()
- {
- if(_purgeDirectorInNextLoop)
- _purgeDirectorInNextLoop=false;
- purgeDirector();
- }
- elseif(!_invalid)
- {
- drawScene();
- //releasetheobjects
- PoolManager::getInstance()->getCurrentPool()->clear();
- }
- }
voidAutoreleasePool::clear()