首页 > 代码库 > cocos2dx3.0 对象池
cocos2dx3.0 对象池
class CC_DLL AutoreleasePool { public: //创建一个存放ref的对象池,并且放入PoolManager对象池管理器中 AutoreleasePool(); //创建一个存放ref的对象池,并且放入PoolManager对象池管理器中,并取个名字 AutoreleasePool(const std::string &name); ~AutoreleasePool(); //添加一个ref对象到对象池中 void addObject(Ref *object); //循环遍历容器并让容器中的ref对象调用release,最后清理容器,设置_isClearing 为true //(调用release函数的作用是计数减1,如果计数为0,删除对象。 //比如我们创建一个精灵时计数为1并加到对象池中,添加到场景中时计数加1变为2, //该帧结束前,遍历对象池中的对象,调用release函数,使每个刚创建的精灵计数减1 , //并且判断如果为0时删除该精灵,然后清空该对象池了来准备存放以后创建的对象,周而复始) void clear(); #if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0) //判断是否为空 bool isClearing() const { return _isClearing; }; #endif //判断容器中是否有该ref对象 bool contains(Ref* object) const; //调试用的东东 void dump(); private: //存放对象的容器,别忘了他每帧结束前遍历元素使之调用release,最后容器被清空了 std::vector<Ref*> _managedObjectArray; //池的名字,好像没什么用。。。 std::string _name; #if defined(COCOS2D_DEBUG) && (COCOS2D_DEBUG > 0) bool _isClearing; #endif }; class CC_DLL PoolManager { public: CC_DEPRECATED_ATTRIBUTE static PoolManager* sharedPoolManager() { return getInstance(); } //如果为NULL,创建一个对象池管理器,并且创建一个对象池 static PoolManager* getInstance(); CC_DEPRECATED_ATTRIBUTE static void purgePoolManager() { destroyInstance(); } static void destroyInstance(); //得到当前的AutoreleasePool对象池,别忘了AutoreleasePool中存放着ref对象 AutoreleasePool *getCurrentPool() const; //对象池管理器中是否存在该对象 bool isObjectInPools(Ref* obj) const; //友元函数可以调用AutoreleasePool的私有成员或函数(没记错的话。。) friend class AutoreleasePool; private: PoolManager(); ~PoolManager(); //加入和删除对象池 void push(AutoreleasePool *pool); void pop(); //对象池管理器单例 static PoolManager* s_singleInstance; //存放对象池的容器 std::deque<AutoreleasePool*> _releasePoolStack; //当前的对象池 AutoreleasePool *_curReleasePool; };
不知道是不是我考虑千周到,我好像发现一个bug在CCAutoreleasePool.cpp中 PoolManager* PoolManager::getInstance() { if (s_singleInstance == nullptr) { s_singleInstance = new PoolManager(); // Add the first auto release pool s_singleInstance->_curReleasePool = new AutoreleasePool("cocos2d autorelease pool"); //s_singleInstance->_releasePoolStack.push_back(s_singleInstance->_curReleasePool);//添加了第2遍 } return s_singleInstance; } PoolManager::~PoolManager() { CCLOGINFO("deallocing PoolManager: %p", this); while (!_releasePoolStack.empty()) { AutoreleasePool* pool = _releasePoolStack.back(); //_releasePoolStack.pop_back();删除了2次 delete pool; } } 如果正常跑起来是没有错误的,但是如果我在自己代码中创建了一个AutoreleasePool* a = new AutoreleasePool("a");后就会报错, 怎么不能用自定义的对象呢,结果发现代码中的问题,我把2段代码注释了后就能在代码中任意添加AutoreleasePool对象。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。