那么一个基本,却又efficient的结构究竟是什么样的呢?很简单。所有你所需要的就是引擎,无限状态机和内存池。这三个东西一点都不复杂,你可以从头开始写:
首先是你的引擎类,需要些什么呢?
class CEngine
{
public:
CEngine();
~CEngine();
int Initialize();
int Start();
int Restart();
int Pause();
int Shutdown();
int AddModule(CModuleBase *newModule, int moduleID, int updateFrequency);
int RemoveModule(int moduleID);
};
这就是一个引擎需要具备的基本功能,不要管图形,也不要管网络,什么都不要管。只是负责加入一个模块,加入的模块在指定的时间内刷新。这样网络也好,图形也好,人工智能也好,都是以模块的形式在初试化的时候加入到引擎的刷新列表里面。
那么无限状态机又是什么呢,无限状态机就是一个给你储存状态的库,不过可以储存所有你想要的状态。比如你在刷新网络的时候,接收到新的玩家的坐标,那么就需要把坐标的值修改,那么坐标的值放在哪呢?无限状态机里面,在网络模块更新的时候,只需要写Set("坐标", &myCurPos);然后在图形模块更新的时候,只需要写myCurPos = Get("坐标")。那么myCurPos的值存放在什么地方呢?就是存放在内存池里面。内存池在游戏初始化的时候被创建,在游戏结束的时候销毁,提供游戏中所有数据的存放,而无限状态机则是提供字符串到数据指针的映射。
下面就来看看无限状态机的实现:
首先你需要一个内存池:
// MemoryMag.h
#ifndef __MEMORY_MAG_H__
#define __MEMORY_MAG_H__
#include <stdio.h>
#include <assert.h>
template <class T>
class CMemoryMag
{
public:
CMemoryMag(int size);
~CMemoryMag();
T *GetNew();
int Free(T *var);
private:
T *m_data;
int *m_freed;
int m_freedSize;
int m_maxSize;
int m_curSize;
};
template<class T>
CMemoryMag<T>::CMemoryMag(int size) :
m_maxSize(size),
m_curSize(0),
m_freedSize(0)
{
m_data = new T[size];
assert(m_data != NULL);
m_freed = new int[size];
assert(m_freed != NULL);
}
template<class T>
CMemoryMag<T>::~CMemoryMag()
{
delete [] m_data;
delete [] m_freed;
}
template<class T>
T *CMemoryMag<T>::GetNew()
{
if(!m_freedSize)
{
if(m_curSize <