Cocos2dx对象池的一个实现
2013-08-23 16:49
405 查看
// // 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方法,
为了避免内存的无限增长,需要定时检查空余内存
相关文章推荐
- Java网络与多线程系列之1:实现一个简单的对象池
- 用Java实现一个通用并发对象池
- 用cocos2dx实现一个秒表级的计时器。
- cocos2dx-3.3 lua实现一个单选按钮
- (原创)一个超级对象池的实现
- Java网络与多线程系列之1:实现一个简单的对象池
- 如何实现一个对象池
- (转载)一个通用并发对象池的实现
- 寒風的Cocos2dx之旅之如何实现一个动画的播放
- 一个通用并发对象池的实现
- 一个通用并发对象池的实现
- 一个简单的Java对象池实现——可用来解决SimpleDateFormat的线程安全问题
- cocos2dx中用触摸机制实现在一个方向上拖动精灵。
- 一个通用并发对象池的实现
- 一个很好的对象池实现
- 一个简单观察者模式的实现 cocos2dx
- 一个简单观察者模式的实现 cocos2dx
- 【小项目】实现一个简单的对象池,用来管理空间的申请和释放
- (原创)一个超级对象池的实现
- 简单的实现一个类似于Cocos2dx的游戏框架——导演、场景、层、精灵(已填坑5%)