[cocos2d-x]我发现的内存管理机制的一些问题
2024-10-20 08:53:06
之前看过的一些文章中关于内存的管理机制讲的非常好,但是我发现它们在谈到每一帧都会创建一个新的内存池的时候,我发现源码并不是这样:
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的版本)
最新文章
- 线段树 Interval Tree
- shutdown命令
- ASP.NET MVC 4 插件化架构简单实现-思路篇
- CodeSmith listview属性
- 使用k-means对3D网格模型进行分割
- AsyncTask api
- mac系统奔溃无法启动时,如何备份重要资料
- WebStorm主题设置
- 模块“XXX.dll”加载失败
- 201521123089 《Java程序设计》第11周学习总结
- parse_str 与 http_build_query的使用
- Meet Python
- python import自定义模块方法
- Shell中echo改变输出显示样式
- grokking deep learning
- 11,EasyNetQ-调度事件与定时发布
- 解决移动端H5海报滑动插件适应大部分手机问题 手机端高度自适应
- JavaScript 对象属性作实参以及实参对象的callee属性
- 位图索引对于DML操作的影响
- 用Python实现多站点运维监控