멀티 플레이어 게임을위한 간단한 게임 서버를 구성하는 방법은 무엇입니까?


9

간단한 게임을위한 간단한 멀티 플레이어 게임 서버를 만들고 싶습니다 :

이 게임은 커맨드 앤 컨커와 비슷해야하며 탱크와 군인이 몇 명 있습니다. 군인 한 명을 선택하고 군인이 가야 할지도를 클릭하는 것보다. 군인이 갈 수없는 곳에 오면 걸어 다닙니다. 그리고 군인들은 적에게 격추 될 수 있습니다.

게임 서버를 어떻게 구성하고 클라이언트에서 무엇을해야합니까?

즉, 군인이 X에서 Y로 이동하지만 Z 건물 주변에서는 서버가 군인이 위치한 위치를 정확하게 계산할 수 있어야하며 (적의 경우 총에 맞을 경우) 클라이언트도 위치를 알아야합니다 군인을 그림.

서버에서 수행해야 할 작업은 프로토콜을 사용해야한다고 생각합니다. 서버가 게임 상태와 시간을 추적해야한다고 생각합니다. 이 작업을 수행하는 방법에 대한 제안이 있습니까? 아니면 독서를 권할 수 있습니까?

답변:


12

일반적으로 이는 매우 복잡한 주제입니다. 두 가지 상충되는 목표가 있습니다 (적어도 전용 서버에서 모든 단일 게임을 실행할 계획이없는 경우).

  1. 부정 행위를 방지하고 모든 클라이언트가 동일한 내용을 볼 수 있도록 서버에서 가능한 많은 작업을 수행해야합니다.
  2. 그러나 당신은 또한 공정한 일을 원합니다. 즉, 한 사람이 서버에 0 번 핑을 보내고 다른 사람은 네트워크 지연을 겪는 경우, 둘 다 동시에 자신의 장치에 명령을 내리면 "서버"플레이어가 유리합니다 .

나는 RTS를 위해 그것을 해결하는 방법을 정확하게 말할 수 없다. FPS 발사를 위해하는 일은 서버가 완전한 월드 상태를 잠시 저장하고 클라이언트가 모든 샷을 타임 스탬프하도록하는 것입니다. "I fired!"라는 네트워크 메시지가 표시 될 때 서버가 서버에 도달하면 서버가 월드를 롤백하고 월드에서 충돌 테스트 등을 할 수 있습니다.

많은 단위를 사용하려는 경우 서버가 처리 할 수있는 처리량이 너무 많아 질 수 있습니다. 해킹이나 부정 행위에 대해 크게 걱정하지 않는다면 클라이언트에서 길 찾기를하고 그 결과를 서버로 보내는 것이 좋습니다.

또 다른 옵션은 대신 peer2peer를 사용하여 각 클라이언트가 로컬 팀의 업데이트를 처리하도록 할 수 있지만 누가 누가 무엇을하는지 등을 결정하는 방법에 대한 질문이 열립니다.

이 프로젝트가 얼마나 복잡한 지, 얼마나 많은 노력을 기울일 것인지에 따라, 가장 좋은 제안은 예비적인 것을 결정하고 테스트를 시작하는 것입니다.


1
실제로 세 가지 (또는 더 많은) 상충되는 목표가 있습니다. 세 번째는 성능, 서버에서 실시간 게임 상태를 완전히 유지하고 업데이트하는 데 많은 리소스를 사용한다는 것입니다.
바트 반 Heukelom

2
아, 다른 플레이어의 평균 지연과 동일한 인공 지연을 도입하여 2 번을 쉽게 해결할 수 있습니다. 글쎄, 만약 당신이 "모두에게 나쁜 짓을한다고"해결책을 부를 수 있다면 그것은 바로 그 것입니다.
Bart van Heukelom

@Bart : 부분적으로 사실이지만, 물론 인위적으로 발생하는 지연 시간에 대한 제한이 있거나 느린 연결은 지속적으로 빠른 연결을 너무 많이 지연시킬 수 있습니다.
o0 '.

클라이언트가 서버에 솔루션을 보낸 후에는 모든 경로와 함께 올바른지 확인하는 한, 최상의 경로를 찾는 것은 문제가되지 않습니다.
o0 '.

2

기본적으로 두 가지 접근 방식이 있습니다.

  1. 신뢰할 수있는 클라이언트
  2. 신뢰할 수없는 클라이언트

신뢰할 수있는 클라이언트는 조금 더 복잡하지만 서버에서 많은 계산을 오프로드 할 수 있다는 이점이 있습니다. 서버 운영 비용은 멀티 플레이어 게임에서 가장 큰 문제 중 하나이며 확장 성을 크게 떨어 뜨립니다.

초보자에게 좋은 방법은 각 플레이어 클라이언트가 자신의 유닛을 처리하도록하는 것입니다. 다음 단계에서 스페어 사이클을 사용하여 플레이어 클라이언트가 다른 클라이언트 작업을 확인할 수 있습니다. 서버는 메시지 교환, 동기화 유지 및 지속성 (예 : 데이터베이스) 이상의 작업을 수행 할 필요가 없습니다.

어떤 종류의 로비 나 채팅을하려는 경우, 여분의 서버에서 이러한 각 주제를 처리하십시오. 그것은 길을 훨씬 더 쉽게 만들 것입니다.


고마워, 그것은 유익했다. 신뢰할 수없는 클라이언트를 위해 가고 서버에서 작업해야한다고 생각합니다. 처음에는 많은 선수가 없습니다.
Jonas

1
"나는 많은 선수가 없을 것이다 ..."나는 그 줄을주고 6 주 후에 다시 돌아 오는 개발자의 수를 셀 수 없다. :( ". 명심하세요!
Andreas

9
"신뢰할 수있는 클라이언트"는 접근 방식이 아니며 실수입니다.
o0 '.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.