cocos2dx3.0 对象池
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdzE4NzY3MTA0MTgz/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">
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 对象池的更多相关文章
- Cocos2d-X3.0 刨根问底(四)----- 内存管理源码分析
本系列文章发表以来得到了很多朋友的关注,小鱼在这里谢谢大家对我的支持,我会继续努力的,最近更新慢了一点,因为我老婆流产了抽了很多时间来照顾她希望大家谅解,并在此预祝我老婆早日康复. 上一篇,我们完整的 ...
- Egret中的对象池ObjectPool
为了可以让对象复用,防止大量重复创建对象,导致资源浪费,使用对象池来管理. 对象池具体含义作用,自行百度. 一 对象池A 二 对象池B 三 字符串key和对象key的效率 一 对象池A /** * 对 ...
- 对象池与.net—从一个内存池实现说起
本来想写篇关于System.Collections.Immutable中提供的ImmutableList里一些实现细节来着,结果一时想不起来源码在哪里--为什么会变成这样呢--第一次有了想写分析的源码 ...
- 通用对象池ObjectPool的一种简易设计和实现方案
对象池,最简单直接的作用当然是通过池来减少创建和销毁对象次数,实现对象的缓存和复用.我们熟知的线程池.数据库连接池.TCP连接池等等都是非常典型的对象池. 一个基本的简易对象池的主要功能实现我认为应该 ...
- paip.提升性能----数据库连接池以及线程池以及对象池
paip.提升性能----数据库连接池以及线程池以及对象池 目录:数据库连接池c3po,线程池ExecutorService:Jakartacommons-pool对象池 作者Attilax 艾龙, ...
- common-pool2对象池(连接池)的介绍及使用
我们在服务器开发的过程中,往往会有一些对象,它的创建和初始化需要的时间比较长,比如数据库连接,网络IO,大数据对象等.在大量使用这些对象时,如果不采用一些技术优化,就会造成一些不可忽略的性能影响.一种 ...
- Cocos2d-X3.0 刨根问底(八)----- 场景(Scene)、层(Layer)相关源码分析
本章节我们重点分析Cocos2d-x3.0与 场景.层相关的源码.这部分源码集中在 libcocos2d –> layers_scenes_transitions_nodes目录下面 我先发个截 ...
- Cocos2d-X3.0 刨根问底(七)----- 事件机制Event源码分析
这一章,我们来分析Cocos2d-x 事件机制相关的源码, 根据Cocos2d-x的工程目录,我们可以找到所有关于事件的源码都存在放在下图所示的目录中. 从这个event_dispatcher目录中的 ...
- Apache Commons-pool实现对象池(包括带key对象池)
Commons-pool是一个apache开源组织下的众多项目的一个.其被广泛地整合到众多需要对象池功能的项目中. 官网:http://commons.apache.org/proper/common ...
随机推荐
- .net SignalR 聊天室
代码地址:https://gitee.com/srnsrn/netSignalr.git 运行项目打开多个页面 私密聊天
- mycat 优化
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u014180504/article/details/76595247show @@datanode; ...
- mybatis分页方式对比
mybatis有两种分页方法(转自:http://blog.csdn.net/leozhou13/article/details/50394242) 1.内存分页,也就是假分页.本质是查出所有的数据然 ...
- ambari单节点集群塔建
配置2台机器,发别为ambari01.ambari03.ambari01上部署Ambari-server和Mirror server,另一台机器上部署agent. 一.配置静态IP 运行命令,让配置生 ...
- 刷题总结——树的同构(bzoj4337 树上hash)
Description 树是一种很常见的数据结构. 我们把N个点,N-1条边的连通无向图称为树. 若将某个点作为根,从根开始遍历,则其它的点都有一个前驱,这个树就成为有根树. 对于两个树T1和T2,如 ...
- 洛谷P1469找筷子
题目描述 经过一段时间的紧张筹备,电脑小组的“RP餐厅”终于开业了,这天,经理LXC接到了一个定餐大单,可把大家乐坏了!员工们齐心协力按要求准备好了套餐正准备派送时,突然碰到一个棘手的问题,筷子!CX ...
- 洛谷P1101 单词方阵
题目描述 给一nXn的字母方阵,内可能蕴含多个“yizhong”单词.单词在方阵中是沿着同一方向连续摆放的.摆放可沿着8个方向的任一方向,同一单词摆放时不再改变方向,单词与单词之间[color=red ...
- luogu 3709 大爷的字符串题 构造 莫队 区间众数
题目链接 题目描述 给你一个字符串a,每次询问一段区间的贡献 贡献定义: 每次从这个区间中随机拿出一个字符\(x\),然后把\(x\)从这个区间中删除,你要维护一个集合S 如果\(S\)为空,你\(r ...
- 标准C程序设计七---32
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- mysql into outfile 导出
<sql> into outfile 'xxx.txt' FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n'; <sql> 表示 ...