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方法,
为了避免内存的无限增长,需要定时检查空余内存