2014-05-25 1 views
0

스레딩과 WinSock에 익숙하지 않습니다.C + + 클라이언트 - 서버 멀티 플레이어 게임을위한 우수 사례

대학 프로젝트의 경우 통신용 WinSock과 WinAPI 스레드를 사용하여 C/C++로 작성한 간단한 멀티 플레이어 게임을 작성하여 여러 클라이언트 (최대 4 개)를 처리해야합니다.

게임은 꽤 솔직합니다. 플레이어는 보드를 따라 점을 이동하고 흔적을 남깁니다. 주어진 시간에 가장 큰 지역을 커버 할 수 있었던 플레이어가 게임에서 승리합니다.

클라이언트 측 응용 프로그램에서 2 개의 스레드를 실행 중입니다. 첫 번째는 누른 키에 대한 정보를 서버로 보냅니다. 두 번째 것은 서버 (모든 플레이어의 코디)에서 데이터를 수신하고 세계를 그립니다.

각 클라이언트가 자신의 입력을 수신 할 수 있도록 1 스레드를 실행하는 서버 측 Im에서 서버의 Coords를 업데이트하십시오. 로직을 수행하는 또 다른 스레드가 있습니다 (충돌을 확인하고 플레이어가 화면을 벗어나지 않았는지 확인). 끊임없이 플레이어 코디를 모든 클라이언트에게 보냅니다.

메신저 양쪽에 블로킹 소켓을 사용합니다.

게임을 2 명의 플레이어로 테스트 한 결과, 서버와 클라이언트는 모두 동일한 네트워크의 다른 컴퓨터에 있었으며 플레이어는 눈에 띄지 않는 지연을 경험하고 원활하게 움직이지 않습니다.

내 접근 방식이 완전히 잘못 되었습니까? 멀티 플레이어 게임을위한 서버 및 클라이언트 응용 프로그램을 만드는 가장 좋은 방법은 무엇입니까?

답변

0

소켓은 일반적으로 네트워크 효율성을 높이기 위해 여러 개의 작은 메시지를 하나의 전송으로 결합하려고합니다. 그러나 이것은 전송하기 전에 더 많은 데이터를 얻기 위해 잠시 동안 버퍼에 앉아 있기 때문에 대부분의 메시지 전송 속도를 늦 춥니 다. 이것이 "Nagle 알고리즘"입니다. TCP_NODELAY를 사용하여 SetSocketOpt를 사용하여 해제 할 수 있습니다. 대기 시간이 단축됩니다.

로컬 네트워크의 일부 플레이어의 경우 서버를 사용하는 대신 피어 투 피어 통신 구성을 고려할 수 있습니다. 서버를 통해 모든 것을 라우팅하면 통신 지연이 적어도 두 배가됩니다.

+0

참으로 잠깐 지연이 줄어 듭니다. 감사합니다. –

관련 문제