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对象。
时间: 2024-10-30 21:12:51

cocos2dx3.0 对象池的相关文章

在Cocos2d-X3.0中使用瓦片地图中的对象层

在Cocos2d-X中使用瓦片地图是非常常见的,例如在跑酷和塔防游戏中通常会用到瓦片地图,在前面的博客中我也介绍了瓦片地图的使用,这篇博客主要介绍在Cocos2d-X3.0中使用瓦片地图中的对象层,因为3.0和2.0中调用瓦片地图的对象层的方式有所不同 对于瓦片地图的使用可以参考我的博客 瓦片地图编辑器的使用:http://blog.csdn.net/u010105970/article/details/41118191 在Cocos2d-X中使用瓦片地图<一>:http://blog.csd

cocos2dx3.0 Ref

cocos2dx中所有对象都继承于Ref,或者继承于 Ref和Clonable Ref中就是维护了一个计数器,用于判断该继承于Ref的对象是否应该delete class CC_DLL Ref { public: //计数加1 void retain(); //计数减1,如果为0,删除对象 void release(); //添加到对象池中,别忘了PoolManager(对象池管理器) 管理AutoreleasePool(对象池),AutoreleasePool管理Ref Ref* autore

整数对象池

Python 的内建对象存放在源代码的Objects目录下.intobject.c用于整数对象 在 Python 中,整数分为小整数对象和大整数对象 小整数对象 由于数值较小的整数对象在内存中会很频繁地使用,如果每次都向内存申请空间.请求释放,会严重影响 Python 的性能.好在 整数对象 属于不可变对象,可以被共享而不会被修改导致问题,所以为 小整数对象 划定一个范围,即小整数对象池,在Python运行时初始化并创建范围内的所有整数,这个范围内的 整数对象是被共享的,即一次创建,多次共享引用

对象池实现分析

对象池实现分析 什么是对象池技术?对象池应用在哪些地方? 对象池其实就是缓存一些对象从而避免大量创建同一个类型的对象,类似线程池的概念.对象池缓存了一些已经创建好的对象,避免需要时才创建对象,同时限制了实例的个数.池化技术最终要的就是重复的使用池内已经创建的对象.从上面的内容就可以看出对象池适用于以下几个场景: 创建对象的开销大 会创建大量的实例 限制一些资源的使用 如果创建一个对象的开销特别大,那么提前创建一些可以使用的并且缓存起来(池化技术就是重复使用对象,提前创建并缓存起来重复使用就是池化

Tomcat6.0数据库连接池配置

http://blog.163.com/magicc_love/blog/static/185853662201111101130969/ oracle驱动包Tomcat 6.0配置oracle数据库连接池 安装Tomcat后,在我的电脑-属性—>高级-->环境变量系统变量中添加以下环境变量(假定你的tomcat安装在c:\tomcat); CATALINA_HOME: c:\tomcat CATALINA_BASE: c:\tomcat TOMCAT_HOME: c:\tomcat 然后修改

屏幕坐标和世界坐标的转换+对象池技术(3D打地鼠小游戏)

游戏中可能经常会遇到需要某个物体跟着鼠标移动,然后又需要把物体放在某个鼠标指定的位置 实现方式 Camera.main.WorldToScreenPoint Camera.main.ScreenToWorldPoint 3D打地鼠实例 我这里用到的素材都比较简陋,几乎全是用Unity做的 首先是锤子 就是两个Cylinder,在把手的位置放一个空物体用于模拟锤子的动作,命名为Hammer,把锤子作为Hammer的子物体,给Hammer添加Animation动画: 在三个关键帧位置设置Hammer

cocos2dx3.0 打飞机

cocos2dx3.0 + vs2013 简单打飞机游戏 本文地址:http://blog.csdn.net/qq_26437925/article/details/52059069 游戏资源,借用了微信打飞机的图库 初版源码地址:https://github.com/doctording/cocos2dx_plane_cpp 滚动背景问题: 持续按键,执行动作 例如:需要移动时,若一直按着A键,那么飞机将一直往左移动 解决方案: 设置一个变量,标识A键是否被按下,在update()方法中执行左

对象池的实现与性能测试

引用对象池的好处:从池中操作对象比直接new.free要性能更快,且能避免内存碎片的堆积 先贴对象池的代码: namespace LegendServer.Util { //对象基 public abstract class ObjectBase { public abstract void Init(); } //对象池管理器(采用堆栈存储,支持动态扩容,支持多线程,新扩容的则自动加入到池中能被重复利用) public class ObjectPoolManager<T> where T :

对象池的设计

对象池的设计及其实现 对象池概述: 对象池模型创建并拥有固定数量的对象,当程序需要一个新的对象时,如果对象池中有空闲对象,则立即返回,否则才创建新的该类对象.当一个对象不再被使用时,其应该应该将其放回对象池,以便后来的程序使用.由于系统资源有限,一个对象池模型应该指定其可容纳的最大对象数量.当达到该数量时,如果仍然有对象创建请求,则抛出异常或者阻塞当前调用线程,直到一个对象被放回对象池中. 对象池模型适用的场景: (1)需要使用大量对象 (2)这些对象的实例化开销比较大且生存期比较短 对象池优势