c++对象池使用

//
//  ObjectPool.h
//  DragonBall
//
//  Created by user on 13-8-22.
//
//

#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;
        Ref* temp = (Ref*)t;
        log("temp.ref : %d",temp->getReferenceCount());
        delete t;
    }
private:

    // 使用两个list一个用来放已经使用的,一个用来放未使用的
    vector<T*> m_freeList;
    vector<T*> m_usedList;

    // 初始容量
    int m_initSize;

};

使用的时候 先实例化

ObjectPool<T> * objectPool = new ObjectPool<T>(size);
   auto pRet;
   if(objectPool->request()){
       pRet = objectPool->request();
   }
   else{
      pRet = new T() ;
   }

pRet->remove();
objectPool->putBack(T);
时间: 2024-11-06 21:26:41

c++对象池使用的相关文章

整数对象池

Python 的内建对象存放在源代码的Objects目录下.intobject.c用于整数对象 在 Python 中,整数分为小整数对象和大整数对象 小整数对象 由于数值较小的整数对象在内存中会很频繁地使用,如果每次都向内存申请空间.请求释放,会严重影响 Python 的性能.好在 整数对象 属于不可变对象,可以被共享而不会被修改导致问题,所以为 小整数对象 划定一个范围,即小整数对象池,在Python运行时初始化并创建范围内的所有整数,这个范围内的 整数对象是被共享的,即一次创建,多次共享引用

对象池实现分析

对象池实现分析 什么是对象池技术?对象池应用在哪些地方? 对象池其实就是缓存一些对象从而避免大量创建同一个类型的对象,类似线程池的概念.对象池缓存了一些已经创建好的对象,避免需要时才创建对象,同时限制了实例的个数.池化技术最终要的就是重复的使用池内已经创建的对象.从上面的内容就可以看出对象池适用于以下几个场景: 创建对象的开销大 会创建大量的实例 限制一些资源的使用 如果创建一个对象的开销特别大,那么提前创建一些可以使用的并且缓存起来(池化技术就是重复使用对象,提前创建并缓存起来重复使用就是池化

屏幕坐标和世界坐标的转换+对象池技术(3D打地鼠小游戏)

游戏中可能经常会遇到需要某个物体跟着鼠标移动,然后又需要把物体放在某个鼠标指定的位置 实现方式 Camera.main.WorldToScreenPoint Camera.main.ScreenToWorldPoint 3D打地鼠实例 我这里用到的素材都比较简陋,几乎全是用Unity做的 首先是锤子 就是两个Cylinder,在把手的位置放一个空物体用于模拟锤子的动作,命名为Hammer,把锤子作为Hammer的子物体,给Hammer添加Animation动画: 在三个关键帧位置设置Hammer

c++实现游戏开发中常用的对象池(含源码)

c++实现游戏开发中常用的对象池(含源码) little_stupid_child2017-01-06上传 对象池的五要素: 1.对象集合 2.未使用对象索引集合 3.已使用对象索引集合 4.当前使用量 5.最大使用量 http://download.csdn.net/download/little_stupid_child/9730912

对象池的实现与性能测试

引用对象池的好处:从池中操作对象比直接new.free要性能更快,且能避免内存碎片的堆积 先贴对象池的代码: namespace LegendServer.Util { //对象基 public abstract class ObjectBase { public abstract void Init(); } //对象池管理器(采用堆栈存储,支持动态扩容,支持多线程,新扩容的则自动加入到池中能被重复利用) public class ObjectPoolManager<T> where T :

深度剖析C++对象池自动回收技术实现

http://www.tuicool.com/articles/mQBfQfN 对象池可以显著提高性能,如果一个对象的创建非常耗时或非常昂贵,频繁去创建的话会非常低效.对象池通过对象复用的方式来避免重复创建对象,它会事先创建一定数量的对象放到池中,当用户需要创建对象的时候,直接从对象池中获取即可,用完对象之后再放回到对象池中,以便复用.这种方式避免了重复创建耗时或耗资源的大对象,大幅提高了程序性能.本文将探讨对象池的技术特性以及源码实现. 对象池类图 ObjectPool:管理对象实例的pool

对象池的设计

对象池的设计及其实现 对象池概述: 对象池模型创建并拥有固定数量的对象,当程序需要一个新的对象时,如果对象池中有空闲对象,则立即返回,否则才创建新的该类对象.当一个对象不再被使用时,其应该应该将其放回对象池,以便后来的程序使用.由于系统资源有限,一个对象池模型应该指定其可容纳的最大对象数量.当达到该数量时,如果仍然有对象创建请求,则抛出异常或者阻塞当前调用线程,直到一个对象被放回对象池中. 对象池模型适用的场景: (1)需要使用大量对象 (2)这些对象的实例化开销比较大且生存期比较短 对象池优势

Unity3D中对象池的实现

在Unity中常常会遇到需要重复创建,销毁某些物体的情况,比如fps类游戏中的子弹,rpg类游戏中的小怪等等,如果直接使用Instantiate和Destroy的话,会浪费系统的资源,而使用对象池则能够节省下这些浪费. 这里使用一个重复利用子弹的进行发射的简单场景来演示对象池. 首先需要一个在场景中创建一个Cube,充当子弹. 然后在Assets目录下创建Resources文件夹,在Cube上添加上刚体,取消重力后,将Cube拖入Resources文件夹内作为一个预设,在场景中删除这个Cube.

论DATASNAP中间件对象池

在此,笔者以DATASNAP为例,其它中间件以此类推. 中间件为什么要使用对象池? 对象池——让所有的对象免堕轮回之苦,对象不再为其生和死而烦恼. 要想让中间件长久稳定地运行,做到无人值守,对象池很重要,对象池大致分为以下几类. 1)线程池,DATASNAP使用INDY10作为其通讯控件,其线程池实际上就是使用INDY10的,只是DATASNAP在其基础上再封装了一层壳罢了,留给我们的只需要设置相关控件的属性即可,在些不多说: 2)服务对象池,DATASNAP向导会生成一个ServerMetho

Netty轻量级对象池实现分析

什么是对象池技术?对象池应用在哪些地方? 对象池其实就是缓存一些对象从而避免大量创建同一个类型的对象,类似线程池的概念.对象池缓存了一些已经创建好的对象,避免需要时才创建对象,同时限制了实例的个数.池化技术最终要的就是重复的使用池内已经创建的对象.从上面的内容就可以看出对象池适用于以下几个场景: 创建对象的开销大 会创建大量的实例 限制一些资源的使用 如果创建一个对象的开销特别大,那么提前创建一些可以使用的并且缓存起来(池化技术就是重复使用对象,提前创建并缓存起来重复使用就是池化)可以降低创建对