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 ...
随机推荐
- python风格之包导入
导入总应该放在文件顶部, 位于模块注释和文档字符串之后, 模块全局变量和常量之前. 导入应该按照从最通用到最不通用的顺序分组: 标准库导入 第三方库导入 应用程序指定导入 每种分组中, 应该根据每个模 ...
- poj2135最小费用最大流经典模板题
Farm Tour Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 13509 Accepted: 5125 Descri ...
- kb-07专题线段树-04--离散化;
/* poj2528 线段树 好题,用到了离散化,二分定位,特殊的区间查寻方式:在下面的代码注释中有详细的解释: */ #include<iostream> #include<cst ...
- *NOI热身赛C. 小x的城池
码农题gun.
- TinyXML2使用教程(转)
原文转自 http://blog.csdn.net/K346K346/article/details/48750417 1.TinyXML2概述 TinyXML2是simple.small.effic ...
- 标准C程序设计七---121
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- php set_time_limit(0) 设置程序执行时间的函数
一个简单的例子,在网页里显示1500条语句,如果未设置失效时间,则程序执行到791时结束了,如果把 set_time_limit(0); 前的注释符//去除,则程序直到1才结束. set_time ...
- dedecms--数据库
最近在用dedecms做项目,dedecms里面有数据库操作类,其实这个在实际项目中用起来还是很方便的. 1:引入common.inc.php文件 require_once (dirname(__FI ...
- 微信小程序踩坑之一[wx.request]请求模式
最近在做小程序时,使用wx.request()方法请求时, 当使传输string类型时,一定要声明method请求模式为post,否则会一直报错,而不声明时默认为get, 已填坑 =,= wx.req ...
- netcore3.0 webapi集成Swagger 5.0
在项目中引用Swashbuckle.AspNetCore和Swashbuckle.AspNetCore.Filters两个dll,在Startup中的ConfigureServices相关配置代码如下 ...