游戏服服务器——对象池

一、介绍

在实际开放中如果某个对象,需要频繁创建和销毁,且创建代价较大,我们可以用对象池来进行管理,在需要对象的时候我们在对象池中找一个空闲的对象,如果对象池中没有,先创建,并交给对象池进行管理,当对象使用完,将对象返回到对象池,用于下次调用。

二、用途

例如游戏服务器中玩家创建,当玩家上线我们需要给玩家创建一个对象,玩家对象创建开销大且很频繁,我们可以用对象池来管理玩家对象的创建和回收。

三、实现过程

在负责对象的类中,维护一个队列用于记录空闲的对象,当我们需要一个对象的时候就去队列之后拿,没有我们就创建一个对象,当对象使用完毕,将其放到队列中。在《四、编码实现》中我们用的是一个对象模板,原理都是一样,使用起来方便一些。

四、编码实现

#pragma once
#include <list>
#include <unordered_map>

//对象池
template<class T, ushort nStep = 8>
class COBjectPool
{	
	typedef std::list<T*> OBJECTPOOLLIST;
	typedef std::unordered_map<T*, BOOL>	OBJECTPOOLMAP;

public:
	COBjectPool(){ }
	~COBjectPool(){ }

public:
	//获得一个空闲对象
	T* GetFreeObject(void)
	{
		if (m_FreeObject.empty())
		{			
			for (ushort i = 0; i < nStep; ++i)
			{
				T* p = new T;
				m_FreeObject.push_back(p);
				m_AllObject.push_back(p);
			}
		}

		OBJECTPOOLLIST::iterator itr = m_FreeObject.begin();
		T* p = (*itr);			
		m_FreeObject.erase(itr);
		m_UseObject[p] = TRUE;
		return p;
	}

	//回收一个空闲对象
	void RecoveryObject(T* p)
	{
		auto iter = m_UseObject.find(p);
		if (iter != m_UseObject.end())
		{	
			m_UseObject.erase(iter);
			m_FreeObject.push_back(p);
		}
	}

	//销毁
	void Destory()
	{
		for (OBJECTPOOLLIST::iterator itr = m_AllObject.begin(); itr != m_AllObject.end(); ++itr)
		{
			T* p = (*itr);
			delete p;
		}

		m_AllObject.clear();
		m_FreeObject.clear();
		m_UseObject.clear();
	}

private:
	OBJECTPOOLLIST		m_AllObject;	//全部对象
	OBJECTPOOLLIST		m_FreeObject;	//空闲队列
	OBJECTPOOLMAP		m_UseObject;	//使用队列
};

猜你喜欢

转载自blog.csdn.net/nie2314550441/article/details/106770526