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 ...
随机推荐
- 网络编程之IO复用:select or epoll
对于服务器的并发处理能力,我们需要的是:每一毫秒服务器都能及时处理这一毫秒内收到的数百个不同TCP连接上的报文,与此同时,可能服务器上还有数以十万计的最近几秒没有收发任何报文的相对不活跃连接.同时处理 ...
- Codeforces Round #345 (Div. 2)——B. Beautiful Paintings(贪心求上升序列个数)
B. Beautiful Paintings time limit per test 1 second memory limit per test 256 megabytes input standa ...
- BZOJ-1798 维护序列
线段树.支持区间加.区间乘.区间查询和. 标记下移还有取模要注意. var n,p,q,i,s,t:longint; a:int64; num,n1,n2,n3:array[0..500000] of ...
- BZOJ3160 万径人踪灭 【fft + manacher】
题解 此题略神QAQ orz po神牛 由题我们知道我们要求出: 回文子序列数 - 连续回文子串数 我们记为ans1和ans2 ans2可以用马拉车轻松解出,这里就不赘述了 问题是ans1 我们设\( ...
- 免安装版MySql安装与配置
1:在MySql官网下载免安装版 http://downloads.mysql.com/archives/community/ 下载链接 http://downloads.mysql.com/arch ...
- webpack错误Chunk.entry was removed. Use hasRuntime()
这个错误在从webpack1升级webpack2或webpack3时候都遇到了,起初查到的都是extract-text-webpack-plugin版本的问题,升级了还是不管用.搜索引擎上查不到其他的 ...
- 浅谈android反调试之 转发端口
反调试方案: 我们最通常使用的动态工具是IDA, IDA的动态调试端口默认为23946,我们可以通过/pro/net/tcp 查看android 系统所有TCP Socket 启动android_se ...
- 线程与threading模块
线程 进程内一个相对独立的.可调度的执行单元,是系统独立调度和分派CPU的基本单位.在单个进程中同时运行多个线程完成不同的工作,称为多线程. 同一进程内的多个线程是共享该进程的资源. 创建新的线程开销 ...
- canvas 转化为 img
]; var image = new Image(); image.src = c.toDataURL("image/png"); $("#qrcode canvas&q ...
- 【HDU3507】Print Article(斜率优化DP)
单调队列DP复出练手题 朴素方程dp[i]=min(dp[j]+(s[i]-s[j-1])^2+m 你懂得 ..]of int64; a,q:array[..]of longint; n,m,i,t, ...