void Director::mainLoop()
{
if (_purgeDirectorInNextLoop)
{
_purgeDirectorInNextLoop = false;
purgeDirector();
}
else if (_restartDirectorInNextLoop)
{
_restartDirectorInNextLoop = false;
restartDirector();
}
else if (! _invalid)
{
drawScene();
// release the objects
//每一帧都会对当前releasePool进行clear(当时疑惑,重复clear,节点岂不是总是会被释放掉??)
PoolManager::getInstance()->getCurrentPool()->clear();
}
}
之前一直有疑惑 releasePool每一帧都被调用一次clear ,那节点总是会被释放掉的啊,,,后来终于找到答案;
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
}
可以看到,在clear方法里,巧妙的用了swap方法。
swap用于vector 的方法说明:
vector<Contestant>(vecContestant).swap(vecContestant);
上面代码的意思是:
vector<Contestant>(vecContestant) 创建一个临时变量,它是 vecContestant的拷贝:这是由 vector的拷贝构造函数来完成的。然而,vector的拷贝构造函数只为 所拷贝的元素分配所需要的内存,所以这个临时变量里面没有多余的数据。然后我们做了 swap操作之后,vecContestant里面就是没有多余数据的 vector了,有着臃肿数据的 vector已经变成了刚刚 的临时变量。这条 语句的结尾,临时变量被析构,从而释放了 先前的 臃肿的 vector所占据的内存。
所以,正是因为用了swap,所以已经被release过的节点已经被踢出releasePool,所以也就不会被重复release操作了,解决了我很久的疑惑。
之前虽然看到有文档说删除对象什么的,但是是对C++的swap方法理解不深,没有参透,看来还是得多看书啊。
本文深入探讨了Cocos2d-x游戏引擎中ReleasePool机制的工作原理,特别是其clear方法如何避免节点的重复释放,通过使用swap技巧确保了资源的有效管理和释放。
399

被折叠的 条评论
为什么被折叠?



