Cocos2dx对象池的一个实现
来源:互联网 发布:php 编译扩展 编辑:程序博客网 时间:2024/05/19 17:57
//// ObjectPool.h// DragonBall//// Created by user on 13-8-22.////#ifndef __DragonBall__ObjectPool__#define __DragonBall__ObjectPool__#include <iostream>#include <vector>#include "cocos2d.h"#include <algorithm>using namespace std;using namespace cocos2d;template <typename T>class ObjectPool{ public: ObjectPool(int initSize):m_initSize(initSize) { CCAssert(m_initSize >= 4, "m_initSize should >= 4"); allocate(initSize); }; virtual ~ObjectPool() { for_each(m_usedList.begin(), m_usedList.end(), freeObject); for_each(m_freeList.begin(), m_freeList.end(), freeObject); } // 请求一个对象 T* request(){ //先检查空闲里面是否为空 if (m_freeList.size() == 0) { allocate(m_initSize/2); } T* t = m_freeList[0]; m_freeList.erase(m_freeList.begin()); m_usedList.push_back(t); return t; }; // 放回一个对象到池里面 void putback(T* t) { for (int i = 0; i < m_usedList.size(); ++i) { if (t == m_usedList[i]) { //找到此对象 m_usedList.erase(m_usedList.begin() + i); m_freeList.push_back(t);return; } } } //为了避免内存的不断增长,需要保持空间 void garbage() { //打印下大小 CCLog("m_usedList.size:%d",m_usedList.size()); CCLog("m_freeList.size:%d",m_freeList.size()); //如果空余的多余20则删除到初始化个数 if (m_freeList.size() > m_initSize) { typename vector<T*>::iterator it = m_freeList.begin(); int pIndex = 0; while (it != m_freeList.end()) { if (pIndex > m_initSize) { T* t = (*it); m_freeList.erase(it); freeObject(t); --it; } ++pIndex; ++it; } } } private: // 分配size个空间 void allocate(int size) { for (int i = 0; i < size; ++i) { T* t = new T; m_freeList.push_back(t); } } static void freeObject(void* p) { T* t = (T*)p; CCObject* temp = (CCObject*)t; CCLog("temp.ref : %d",temp->retainCount()); delete t; }private: // 使用两个list一个用来放已经使用的,一个用来放未使用的 vector<T*> m_freeList; vector<T*> m_usedList; // 初始容量 int m_initSize; };#endif /* defined(__DragonBall__ObjectPool__) */
//初始化里面,参数为默认池的大小
当需要请求一个对象的时候:
CCSprite* sp = m_objectPool->request();
当对象使用完毕后,先从屏幕上移除.,然后再放回池中
firstSprite->removeFromParentAndCleanup(true);
m_objectPool->putback(firstSprite);
注意garbage方法,
为了避免内存的无限增长,需要定时检查空余内存
- Cocos2dx对象池的一个实现
- 一个简单观察者模式的实现 cocos2dx
- [cocos2dx笔记014]一个用于cocos2dx的对象智能指针模板
- 一个通用并发对象池的实现
- 一个通用并发对象池的实现
- (原创)一个超级对象池的实现
- 一个通用并发对象池的实现
- 一个很好的对象池实现
- cocos2dx-lua中实现面向对象的封装继承
- 用cocos2dx实现一个秒表级的计时器。
- cocos2dx 雷达的实现
- cocos2dx socket的一个方案
- 一个cocos2dx的扩展库
- cocos2dx AssetsManager的一个BUG
- cocos2dx AssetsManager的一个BUG
- cocos2dx中Size创建的对象,比较一个Size大小使用equals
- 一个基于特定对象的内存池实现
- 寒風的Cocos2dx之旅之如何实现一个动画的播放
- IOS开发学习笔记(二十一)——Core Data使用(下篇)
- 如何使用ExternalContext类(二)
- 用vs2010制作软件开发包
- discuz获取当前访问用户是否手机用户checkmobile()
- VIM正则表达式再研究
- Cocos2dx对象池的一个实现
- C++中static用法总结
- 卡曼滤波-python
- HTTP协议 (三) 压缩
- Hello World!
- 想学习的几种算法 基本的了解
- Java反射机制
- 自定义Adapter
- Sealed