我是一种新的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