watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdzE4NzY3MTA0MTgz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

  1. class CC_DLL AutoreleasePool
  2. {
  3. public:
  4.  
  5. //创建一个存放ref的对象池。而且放入PoolManager对象池管理器中
  6. AutoreleasePool();
  7.  
  8. //创建一个存放ref的对象池,而且放入PoolManager对象池管理器中,并取个名字
  9. AutoreleasePool(const std::string &name);
  10.  
  11. ~AutoreleasePool();
  12.  
  13. //加入一个ref对象到对象池中
  14. void addObject(Ref *object);
  15.  
  16. //循环遍历容器并让容器中的ref对象调用release,最后清理容器,设置_isClearing 为true
  17. //(调用release函数的作用是计数减1。假设计数为0,删除对象。
  18. //比方我们创建一个精灵时计数为1并加到对象池中。加入到场景中时计数加1变为2,
  19. //该帧结束前。遍历对象池中的对象,调用release函数。使每一个刚创建的精灵计数减1 ,
  20. //而且推断假设为0时删除该精灵。然后清空该对象池了来准备存放以后创建的对象,周而复始)
  21. void clear();
  22.  
  23. #if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
  24.  
  25. //推断是否为空
  26. bool isClearing() const { return _isClearing; };
  27. #endif
  28.  
  29. //推断容器中是否有该ref对象
  30. bool contains(Ref* object) const;
  31.  
  32. //调试用的东东
  33. void dump();
  34.  
  35. private:
  36.  
  37. //存放对象的容器。别忘了他每帧结束前遍历元素使之调用release,最后容器被清空了
  38. std::vector<Ref*> _managedObjectArray;
  39. //池的名字,好像没什么用。。。
  40. std::string _name;
  41.  
  42. #if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0)
  43.  
  44. bool _isClearing;
  45. #endif
  46. };
  47.  
  48. class CC_DLL PoolManager
  49. {
  50. public:
  51.  
  52. CC_DEPRECATED_ATTRIBUTE static PoolManager* sharedPoolManager() { return getInstance(); }
  53. //假设为NULL,创建一个对象池管理器。而且创建一个对象池
  54. static PoolManager* getInstance();
  55.  
  56. CC_DEPRECATED_ATTRIBUTE static void purgePoolManager() { destroyInstance(); }
  57. static void destroyInstance();
  58.  
  59. //得到当前的AutoreleasePool对象池,别忘了AutoreleasePool中存放着ref对象
  60. AutoreleasePool *getCurrentPool() const;
  61.  
  62. //对象池管理器中是否存在该对象
  63. bool isObjectInPools(Ref* obj) const;
  64.  
  65. //友元函数能够调用AutoreleasePool的私有成员或函数(没记错的话。。
  66.  

  67. friend class AutoreleasePool;
  68.  
  69. private:
  70. PoolManager();
  71. ~PoolManager();
  72. //加入和删除对象池
  73. void push(AutoreleasePool *pool);
  74. void pop();
  75.  
  76. //对象池管理器单例
  77. static PoolManager* s_singleInstance;
  78.  
  79. //存放对象池的容器
  80. std::deque<AutoreleasePool*> _releasePoolStack;
  81. //当前的对象池
  82. AutoreleasePool *_curReleasePool;
  83. };
  1. 不知道是不是我考虑千周到,我好像发现一个bugCCAutoreleasePool.cpp
  2. PoolManager* PoolManager::getInstance()
  3. {
  4. if (s_singleInstance == nullptr)
  5. {
  6. s_singleInstance = new PoolManager();
  7. // Add the first auto release pool
  8. s_singleInstance->_curReleasePool = new AutoreleasePool("cocos2d autorelease pool");
  9. //s_singleInstance->_releasePoolStack.push_back(s_singleInstance->_curReleasePool);//加入了第2遍
  10. }
  11. return s_singleInstance;
  12. }
  13. PoolManager::~PoolManager()
  14. {
  15. CCLOGINFO("deallocing PoolManager: %p", this);
  16.  
  17. while (!_releasePoolStack.empty())
  18. {
  19. AutoreleasePool* pool = _releasePoolStack.back();
  20. //_releasePoolStack.pop_back();删除了2次
  21.  
  22. delete pool;
  23. }
  24. }
  25. 假设正常跑起来是没有错误的,可是假设我在自己代码中创建了一个AutoreleasePool* a = new AutoreleasePool("a");后就会报错,
  26. 怎么不能用自己定义的对象呢,结果发现代码中的问题。我把2段代码凝视了后就能在代码中随意加入AutoreleasePool对象。

cocos2dx3.0 对象池的更多相关文章

  1. Cocos2d-X3.0 刨根问底(四)----- 内存管理源码分析

    本系列文章发表以来得到了很多朋友的关注,小鱼在这里谢谢大家对我的支持,我会继续努力的,最近更新慢了一点,因为我老婆流产了抽了很多时间来照顾她希望大家谅解,并在此预祝我老婆早日康复. 上一篇,我们完整的 ...

  2. Egret中的对象池ObjectPool

    为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理. 对象池具体含义作用,自行百度. 一 对象池A 二 对象池B 三 字符串key和对象key的效率 一 对象池A /** * 对 ...

  3. 对象池与.net—从一个内存池实现说起

    本来想写篇关于System.Collections.Immutable中提供的ImmutableList里一些实现细节来着,结果一时想不起来源码在哪里--为什么会变成这样呢--第一次有了想写分析的源码 ...

  4. 通用对象池ObjectPool的一种简易设计和实现方案

    对象池,最简单直接的作用当然是通过池来减少创建和销毁对象次数,实现对象的缓存和复用.我们熟知的线程池.数据库连接池.TCP连接池等等都是非常典型的对象池. 一个基本的简易对象池的主要功能实现我认为应该 ...

  5. paip.提升性能----数据库连接池以及线程池以及对象池

    paip.提升性能----数据库连接池以及线程池以及对象池 目录:数据库连接池c3po,线程池ExecutorService:Jakartacommons-pool对象池 作者Attilax  艾龙, ...

  6. common-pool2对象池(连接池)的介绍及使用

    我们在服务器开发的过程中,往往会有一些对象,它的创建和初始化需要的时间比较长,比如数据库连接,网络IO,大数据对象等.在大量使用这些对象时,如果不采用一些技术优化,就会造成一些不可忽略的性能影响.一种 ...

  7. Cocos2d-X3.0 刨根问底(八)----- 场景(Scene)、层(Layer)相关源码分析

    本章节我们重点分析Cocos2d-x3.0与 场景.层相关的源码.这部分源码集中在 libcocos2d –> layers_scenes_transitions_nodes目录下面 我先发个截 ...

  8. Cocos2d-X3.0 刨根问底(七)----- 事件机制Event源码分析

    这一章,我们来分析Cocos2d-x 事件机制相关的源码, 根据Cocos2d-x的工程目录,我们可以找到所有关于事件的源码都存在放在下图所示的目录中. 从这个event_dispatcher目录中的 ...

  9. Apache Commons-pool实现对象池(包括带key对象池)

    Commons-pool是一个apache开源组织下的众多项目的一个.其被广泛地整合到众多需要对象池功能的项目中. 官网:http://commons.apache.org/proper/common ...

随机推荐

  1. 【转】javascript操作Select标记中options集合

    先来看看options集合的这几个方法:options.add(option)方法向集合里添加一项option对象:options.remove(index)方法移除options集合中的指定项:op ...

  2. iOS--app自定义相册--从自定义的相册中获取图片

    一.获取单张图片 思路: 1.利用UIImagePickerController可以从系统自带的App(照片\相机)中获得图片 2.设置代理,遵守代理协议 注意这个UIImagePickerContr ...

  3. iOS学习笔记27-摄像头

    一.摄像头 在iOS中,手机摄像头的使用有以下两种方法: UIImagePickerController拍照和视频录制 优点:使用方便,功能强大 缺点:高度封装性,无法实现一些自定义工作 AVFoun ...

  4. 【bzoj3210】花神的浇花集会 旋转坐标系

    题目描述 在花老师的指导下,每周4都有一个集会活动,俗称“浇水”活动. 具体浇水活动详情请见BZOJ3153 但这不是重点 花神出了好多题,每道题都有两个参考系数:代码难度和算法难度 花神为了准备浇花 ...

  5. 巧克力(zoj 1363)

    2100年,ACM牌巧克力将风靡全球. “绿的,橘红的,棕色的,红的…”,彩色的糖衣可能是ACM巧克力最吸引人的地方.你一共见过多少种颜色?现在,据说ACM公司从一个24种颜色的调色板中选择颜色来装饰 ...

  6. 【POJ1144】Network(割点)(模板)

    题意:给定一张无向图,求割点个数 思路:感谢CC大神http://ccenjoyyourlife.blog.163.com/的讲解 割点的定义就是某个联通块中删去此点连通性发生变化的的点 有两种割点: ...

  7. 标准C程序设计七---37

    Linux应用             编程深入            语言编程 标准C程序设计七---经典C11程序设计    以下内容为阅读:    <标准C程序设计>(第7版) 作者 ...

  8. hdu 4504(动态规划)

    威威猫系列故事——篮球梦 Time Limit: 300/100 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  9. hdu 2078(DFS)

    Matrix Time Limit: 2000MS   Memory Limit: 30000K Total Submissions: 3845   Accepted: 1993 Descriptio ...

  10. hdu 5444(构造二叉树然后遍历)

    Elven Postman Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)T ...