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 ...
随机推荐
- 【转】javascript操作Select标记中options集合
先来看看options集合的这几个方法:options.add(option)方法向集合里添加一项option对象:options.remove(index)方法移除options集合中的指定项:op ...
- iOS--app自定义相册--从自定义的相册中获取图片
一.获取单张图片 思路: 1.利用UIImagePickerController可以从系统自带的App(照片\相机)中获得图片 2.设置代理,遵守代理协议 注意这个UIImagePickerContr ...
- iOS学习笔记27-摄像头
一.摄像头 在iOS中,手机摄像头的使用有以下两种方法: UIImagePickerController拍照和视频录制 优点:使用方便,功能强大 缺点:高度封装性,无法实现一些自定义工作 AVFoun ...
- 【bzoj3210】花神的浇花集会 旋转坐标系
题目描述 在花老师的指导下,每周4都有一个集会活动,俗称“浇水”活动. 具体浇水活动详情请见BZOJ3153 但这不是重点 花神出了好多题,每道题都有两个参考系数:代码难度和算法难度 花神为了准备浇花 ...
- 巧克力(zoj 1363)
2100年,ACM牌巧克力将风靡全球. “绿的,橘红的,棕色的,红的…”,彩色的糖衣可能是ACM巧克力最吸引人的地方.你一共见过多少种颜色?现在,据说ACM公司从一个24种颜色的调色板中选择颜色来装饰 ...
- 【POJ1144】Network(割点)(模板)
题意:给定一张无向图,求割点个数 思路:感谢CC大神http://ccenjoyyourlife.blog.163.com/的讲解 割点的定义就是某个联通块中删去此点连通性发生变化的的点 有两种割点: ...
- 标准C程序设计七---37
Linux应用 编程深入 语言编程 标准C程序设计七---经典C11程序设计 以下内容为阅读: <标准C程序设计>(第7版) 作者 ...
- hdu 4504(动态规划)
威威猫系列故事——篮球梦 Time Limit: 300/100 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total ...
- hdu 2078(DFS)
Matrix Time Limit: 2000MS Memory Limit: 30000K Total Submissions: 3845 Accepted: 1993 Descriptio ...
- hdu 5444(构造二叉树然后遍历)
Elven Postman Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...