遊戲服服務器——對象池

一、介紹

在實際開放中如果某個對象,需要頻繁創建和銷燬,且創建代價較大,我們可以用對象池來進行管理,在需要對象的時候我們在對象池中找一個空閒的對象,如果對象池中沒有,先創建,並交給對象池進行管理,當對象使用完,將對象返回到對象池,用於下次調用。

 

二、用途

例如遊戲服務器中玩家創建,當玩家上線我們需要給玩家創建一個對象,玩家對象創建開銷大且很頻繁,我們可以用對象池來管理玩家對象的創建和回收。

 

三、實現過程

在負責對象的類中,維護一個隊列用於記錄空閒的對象,當我們需要一個對象的時候就去隊列之後拿,沒有我們就創建一個對象,當對象使用完畢,將其放到隊列中。在《四、編碼實現》中我們用的是一個對象模板,原理都是一樣,使用起來方便一些。

 

四、編碼實現

#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;	//使用隊列
};

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章