cocos2dx3.0 对象池


  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.     friend class AutoreleasePool;  
  67.       
  68. private:  
  69.     PoolManager();  
  70.     ~PoolManager();  
  71.     //加入和删除对象池  
  72.     void push(AutoreleasePool *pool);  
  73.     void pop();  
  74.       
  75.     //对象池管理器单例  
  76.     static PoolManager* s_singleInstance;  
  77.       
  78.     //存放对象池的容器  
  79.     std::deque<AutoreleasePool*> _releasePoolStack;  
  80.     //当前的对象池  
  81.     AutoreleasePool *_curReleasePool;  
  82. };  
[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. 不知道是不是我考虑千周到,我好像发现一个bug在CCAutoreleasePool.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对象。  
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值