저는 리눅스에서 C++ 개발에 새로운 것이므로 멀티 플레이어 게임을 만들려고합니다. 나는이 프로그램이 시작 하기엔 다소 복잡한 프로그램이라는 것을 알고 있지만, 다른 언어의 프로그램에서 이런 유형의 배경 지식을 가지고 있기 때문에 가장 어려운 부분은 언어를 길들인 것이라고 생각합니다.멀티 플레이어 게임 서버용 메모리 할당에 대한 도움
멀티 플레이 게임을 프로그래밍하고 있지만, 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);
}
을 클라이언트 클래스는 연결 IP 같은 (가상 소멸자, 일부 클라이언트 매개 변수가 간단한 클래스입니다 : 클라이언트가 연결하고 연결을 끊을 때이 방법으로,이 같은 뭔가를 시간 등) 및 몇 가지 방법 (예 : 보내기 등)이 포함됩니다. 이것이 메모리 문제없이 클라이언트를 추적하는 가장 좋은 방법입니까? 나는 여전히 새로운 Client() 할당에 대한 예외 처리를 추가해야한다고 생각한다. ...
두 번째 부분은 나에게 가장 어렵다고 생각하는 것은 게임 테이블에 관한 것이다. 클라이언트는 게임 테이블에 입장하거나 떠날 수 있습니다. 많은 매개 변수, 상수 및 메서드가있는 테이블 클래스가 있습니다.
Daemon.cpp
GameTable *tables;
int main() {
tables = new Chess[MAX_NUMBER_OF_TABLES];
}
일부 설명을 : GameTable는 모든 게임의 기본 클래스입니다 저도 같은 Daemon.cpp에서 시작 위에서 설명한 모든 게임 테이블을 만드는거야. 기본 매개 변수 및 가상 게임 기능 (예 : doCommand, addClient, removeClient 등)과의 인터페이스입니다. 체스 클래스는 체스 게임의 구현이며, GameTable에서 상속 (미안하지만 나쁜 영어)입니다. 질문 :
1) 이것을 처리하는 가장 좋은 방법입니까? 2) Chess 클래스에는 많은 수의 매개 변수가 있습니다. Chess 객체의 테이블 목록을 할당 할 때 이미 할당 된 모든 객체에 대한 메모리를 할당하거나 Chess 클래스 (생성자 및 소멸자 포함)를 할당하고 배분해야합니다.
세 번째 질문은 테이블을 추가하거나 테이블에서 클라이언트를 제거하는 방법입니다. 내가 소멸자이었다 클라이언트를 제거 할 때 것으로 나타났습니다
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
실제로. 확실한 확신을 선수 수 등의 생성자 인수로 사용하는 클래스와 함께 작업하고 게임을 진행할 때 계층 적으로 계속 수행하십시오. –