cocos2dx3.0 对象池

Posted yutingliuyl

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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对象。





以上是关于cocos2dx3.0 对象池的主要内容,如果未能解决你的问题,请参考以下文章

cocos2dx3.0 结构图

cocos2dx 3.0 飞机大战

cocos2dx3.0 lua工程怎么打包apk

cocos2dx-3.0(21) 移植android平台 说多了都是泪

cocos2dx android 代码混淆

Cocos2dx-3.0版本 从开发环境搭建(Win32)到项目移植Android平台过程详解