之前看过的一些文章中关于内存的管理机制讲的非常好,但是我发现它们在谈到每一帧都会创建一个新的内存池的时候,我发现源码并不是这样:
PoolManager* PoolManager::getInstance()//这是管理者的单例模式获取方法
{
if (s_singleInstance == nullptr)
{
s_singleInstance = new (std::nothrow) PoolManager();
// Add the first auto release pool
new AutoreleasePool("cocos2d autorelease pool");
}
return s_singleInstance;
}
void AutoreleasePool::clear()//这是每一帧执行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
}
void Director::mainLoop()//每一帧执行的主循环
{
if (_purgeDirectorInNextLoop)
{
_purgeDirectorInNextLoop = false;
purgeDirector();
}
else if (_restartDirectorInNextLoop)
{
_restartDirectorInNextLoop = false;
restartDirector();
}
else if (! _invalid)
{
drawScene();
// release the objects
PoolManager::getInstance()->getCurrentPool()->clear();
}
}
从上面的代码,我的个人理解就是:PoolManager只会在第一次创建的时候产生一个autoreleasePool,而后每一帧调用autoreleasePool的clear()方法,在clear方法中,我们可以看到,它采用的是将当前池中的结点用swap与新一帧的结点交换,然后对交换出来的结点依次调用release(),此时如果结点的引用为0,就会被自动销毁。
(以上问题还是在QQ群和别人交流的时候发现的,之前一直以为别人的博客写的是对的,也就没有去翻看源码,我猜测可能原因有二:第一是我的理解是错误的;第二就是cocos2dx的版本更新进行了改动,我的版本是3.15,而那些博客基本都是14年之前,用的都还是cocos2.x的版本)