就像修房子一样,别管你用多贵的砖头,它只是一块砖头而已,并不是你想要的房子。砖头可以在开发的时候随时换,但是结构一旦定下来,就不好修改了。
那么一个基本,却又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 < m_maxSize) return &m_data[m_curSize++]; return NULL; } return &m_data[m_freed[--m_freedSize]]; } template<class T> int CMemoryMag<T>::Free(T *var) { int i,j; int found = 0; for(j=0; j<m_freedSize; j++) if(&m_data[m_freed[j]] == var) found = 1; if(found) return 0; for(i=0; i<m_curSize; i++) { if(&m_data[i] == var) { found = i; break; } } if(!found) return 0; if(found != (m_curSize - 1)) { m_freed[m_freedSize++] = found; return 1; } m_curSize --; return 1; } #endif ================================================== //然后你需要一个hash表 //hasher.h #ifndef __HASHER_H__ #define __HASHER_H__ #include "MemoryMag.h" class CHasher { public: CHasher(int size); ~CHasher(); int Enter(const char *pStr, void *node); int Remove(const char *pStr); void *Find(const char *pStr); private: int GetHash(const char *pStr); typedef struct hashNode { char *name; void *ptr; struct hashNode *next; } HASHNODE; CMemoryMag<HASHNODE> *m_hashArr; HASHNODE * |