之前看过的一些文章中关于内存的管理机制讲的非常好,但是我发现它们在谈到每一帧都会创建一个新的内存池的时候,我发现源码并不是这样:


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的版本)

最新文章

  1. 线段树 Interval Tree
  2. shutdown命令
  3. ASP.NET MVC 4 插件化架构简单实现-思路篇
  4. CodeSmith listview属性
  5. 使用k-means对3D网格模型进行分割
  6. AsyncTask api
  7. mac系统奔溃无法启动时,如何备份重要资料
  8. WebStorm主题设置
  9. 模块“XXX.dll”加载失败
  10. 201521123089 《Java程序设计》第11周学习总结
  11. parse_str 与 http_build_query的使用
  12. Meet Python
  13. python import自定义模块方法
  14. Shell中echo改变输出显示样式
  15. grokking deep learning
  16. 11,EasyNetQ-调度事件与定时发布
  17. 解决移动端H5海报滑动插件适应大部分手机问题 手机端高度自适应
  18. JavaScript 对象属性作实参以及实参对象的callee属性
  19. 位图索引对于DML操作的影响
  20. 用Python实现多站点运维监控

热门文章

  1. Elasticsearch rest-high-level-client 基本操作
  2. .Net SemaphoreSlim
  3. .NET应用开发之SQLServer常见问题分析
  4. hwlog--utils.go
  5. TCN代码详解-Torch (误导纠正)
  6. HDLBits答案——Getting started
  7. php + layui 文件上传 以及 拖拽上传
  8. jquery组件解决option选项框的样式自定义方案
  9. html CheckBox
  10. 一文教会你如何在内网搭建一套属于自己小组的在线 API 文档?