我是一種新的C++開發在Linux中,我試圖做一個多人遊戲。我知道這是一個複雜的程序開始,但我從其他語言的這種類型的程序有一些背景,所以我認爲最困難的部分是馴服語言。幫助多人遊戲服務器的內存分配
儘管我正在編寫多人遊戲,但我的疑惑是處理內存和避免C++漏洞的最佳方法。
我的疑惑是關於爲客戶端對象和遊戲表分配內存。對於我讀過的客戶端對象,std容器爲我處理內存分配。我不知道這個內存是否分配在堆上,所以我決定使用指針映射(以套接字fd作爲鍵)到客戶端對象。這樣一來,我有這樣的事情,當一個客戶端連接和斷開:
Daemon.cpp
map<int,Client*> clientList;
//Do server stuff
//Add connected client to list
void onConnect(int socketFd) {
clientList[socketFd] = new Client();
}
//remove connected client from list
void onDisconnect(int socketFd) {
delete clientList[socketFd];
clientList.erase(socketFd);
}
Client類是一個簡單的類,它有一個虛析構函數,某些客戶端參數(如IP,連接時間等)和一些方法(如發送等)。這是跟蹤沒有內存問題的客戶的最佳方式嗎?我想我仍然需要在新的Client()分配上添加異常處理......
第二部分,我想對我來說最困難的是關於遊戲桌。客戶可以進入和離開遊戲桌面。我有一個包含大量參數,常量和方法的表類。我創建的所有遊戲桌在啓動時在同一Daemon.cpp上述:
Daemon.cpp
GameTable *tables;
int main() {
tables = new Chess[MAX_NUMBER_OF_TABLES];
}
幾點說明:GameTable是所有遊戲的基類。它是一個基本參數和虛擬遊戲功能的接口(如doCommand,addClient,removeClient等)。國際象棋類是國際象棋遊戲的實施,它從GameTable繼承(對不起壞英語)。問題:
1)這是處理它的最佳方式(內存)嗎? 2)國際象棋類有很多的參數,當我分配國際象棋對象的表列表做的內存已經分配的所有對象或我必須分配和分配在國際象棋類(與構造函數和析構函數)?
我的第三個問題是如何添加和刪除客戶端/從表中。首先,我在與客戶一樣創建一個簡單的載體認爲:
GameTable.h
vector <Client> clientInTable;
Chess.cpp
//Add client to table
void addClient(Client &client) {
clientInList.push_back(client);
}
//remove client from table
void removeClient(Client &client) {
//search client on list, when found get position pos
clientList.erase(pos);
}
不久,我注意到,當我刪除客戶端的析構函數是調用。它一定不會發生!比我在使用中想過像指針的向量:
GameTable.h
vector <Client*> clientInTable;
Chess.cpp
//Add client to table
void addClient(Client *client) {
clientInList.push_back(client);
}
//remove client from table
void removeClient(Client *client) {
//search client on list, when found get position pos
clientList[pos] = NULL;
}
這是處理它的最佳方式?感謝大家的幫助。
非常有趣的建議!謝謝 – Akira 2010-02-23 17:29:45
確實。與確定性作爲構造參數的類一起工作,比如「玩家數量」等等,並且在玩遊戲的時候保持等級化。 – 2010-02-23 17:35:26