문제

멀티플레이어를 만들어본 경험이 있습니다. 턴제 소켓을 이용한 게임은 있지만 실시간 액션 게임은 한번도 시도한 적이 없습니다.어떤 종류의 추가 문제를 처리해야 합니까?지연된 플레이어가 과거에 어떤 행동을 했을 경우를 대비해 플레이어 행동 기록을 보관해야 합니까?정말로 UDP 패킷을 사용해야 합니까, 아니면 TCP로 충분합니까?또 뭐야?

실제로 무엇을 만들지 결정하지는 않았지만 이 질문의 목적에 따라 X Y 이동이 가능한 10인용 2D 게임을 고려해 볼 수 있습니다.

도움이 되었습니까?

해결책

  • '클라이언트 서버' 또는 '피어 투 피어' 또는 그 사이의 것:어떤 컴퓨터가 어떤 게임 동작에 대한 권한을 가지고 있는지.

턴 기반 게임에서는 일반적으로 '서버가 최종 권한을 갖고 있으며 우리는 끝났습니다'라고 말하기가 매우 쉽습니다.실시간 게임의 경우 이러한 디자인이 시작하기에 좋은 곳인 경우가 많지만 대기 시간을 추가하자마자 클라이언트 이동/작업이 반응하지 않는 것처럼 느껴집니다.따라서 클라이언트 입력이 캐릭터나 유닛에 즉시 영향을 미칠 수 있도록 일종의 '대기 시간 숨기기'를 추가하여 문제를 해결하고, 이제 클라이언트와 서버 게임 상태가 갈라지기 시작할 때 조정 문제를 처리해야 합니다.10번 중 9번은 괜찮습니다. 클라이언트가 영향을 준 객체를 권위 있는 위치로 팝하거나 러프하지만, 10번 중 1번은 객체가 플레이어 아바타 같은 것일 때 해당 솔루션은 허용되지 않으므로 시작합니다. 클라이언트에게 일부 작업에 대한 권한을 부여합니다.이제 서버의 여러 게임 상태를 조정해야 하며, 그런 종류의 일에 관심이 있다면 악의적인 클라이언트를 통해 잠재적으로 '속임수'에 노출되어야 합니다.이것은 기본적으로 모든 텔레포트/속임수/어떤 버그/치트가 나타나는 곳입니다.

물론 '모든 클라이언트가 '자신의' 개체에 대한 권한을 갖고 있는' 모델로 시작하고 부정 행위 문제를 무시할 수 있습니다(대부분의 경우 괜찮음).그러나 이제 해당 클라이언트가 탈락하거나 심지어 '시뮬레이션을 따라가는 데 약간 뒤처지는' 경우 게임 시뮬레이션에 막대한 영향을 미치게 됩니다. 사실상 모든 플레이어 게임은 결국 다음과 같은 효과를 느끼거나 느끼게 됩니다. 클라이언트가 따라잡을 때까지 기다리거나 자신이 제어하는 ​​게임 상태가 동기화되지 않는 형태로 클라이언트가 지연되거나 성능이 저하됩니다.

  • '동기화' 또는 '비동기'

모든 플레이어가 동일한 게임 상태에서 작동하도록 하는 일반적인 전략은 위에서 설명한 모델 중 하나를 통해 플레이어 입력 목록에 동의한 다음 게임 플레이 시뮬레이션이 모든 컴퓨터에서 동시에 실행되도록 하는 것입니다.이는 시뮬레이션 논리가 정확히 일치해야 함을 의미합니다. 그렇지 않으면 게임이 동기화되지 않습니다.이것은 실제로 들리는 것보다 쉽고 어렵습니다.게임은 단지 코드일 뿐이고 코드는 동일한 입력(난수 생성기 포함)을 제공할 때 거의 동일하게 실행되기 때문에 더 쉽습니다.그렇지 않은 경우가 두 가지 있기 때문에 더 어렵습니다.(1) 게임 시뮬레이션 외부에서 실수로 무작위를 사용한 경우 및 (2) 플로트를 사용한 경우.전자는 어떤 게임 시스템에서 어떤 RNG를 사용하는지에 대한 엄격한 규칙/어설션을 가짐으로써 수정됩니다.후자는 수레를 사용하지 않음으로써 해결됩니다.(플로트에는 실제로 2가지 문제가 있습니다. 하나는 프로젝트의 최적화 구성에 따라 매우 다르게 작동하지만, 문제가 해결되더라도 서로 다른 프로세서 아키텍처에서 일관되지 않게 작동합니다. ㅋㅋㅋ).스타크래프트/워크래프트 및 '리플레이'를 제공하는 모든 게임은 이 모델을 사용할 가능성이 높습니다.실제로 리플레이 시스템을 갖추는 것은 RNG가 동기화 상태를 유지하는지 테스트하는 좋은 방법입니다.

비동기식 솔루션을 사용하면 게임 상태 당국은 해당 전체 상태를 일정 빈도로 다른 모든 클라이언트에 브로드캐스트하기만 하면 됩니다.클라이언트는 해당 데이터를 가져와 게임 상태에 적용합니다(일반적으로 다음 업데이트를 얻을 때까지 간단한 추정을 수행합니다).여기에서 'udp'가 실행 가능한 옵션이 됩니다. 약 1초마다 전체 게임 상태에 스팸을 보내기 때문에 해당 업데이트의 일부를 삭제하는 것은 관련이 없습니다.게임 상태(지진, 월드 오브 워크래프트)가 상대적으로 적은 게임의 경우 이는 가장 간단한 해결 방법인 경우가 많습니다.

다른 팁

멀티플레이어 설정에는 몇 가지 요소가 관련되어 있습니다.

  1. 프로토콜에서는 TCP를 원하는지 UDP를 원하는지 결정하는 것이 중요합니다.UDP는 오버헤드가 적지만 전달이 보장되지는 않습니다.반대로 TCP가 더 신뢰할 수 있습니다.각 게임에는 선호하는 프로토콜이 있습니다.예를 들어 UDP는 1인칭 슈팅 게임에는 작동하지만 정보의 일관성이 필요한 RTS에는 적합하지 않을 수 있습니다.

  2. 방화벽/연결.멀티플레이어 게임에서 2000개의 아웃바운드 연결을 설정할 필요가 없고 표준 포트를 사용하므로 포트 전달이 쉽습니다.Windows 방화벽과의 인터페이스는 아마도 추가 보너스가 될 것입니다.

  3. 대역폭.이것은 중요합니다. 네트워크 연결을 통해 얼마나 많은 데이터를 푸시하려고 합니까?나는 이것이 테스트 및 녹음 처리량을 재생하는 데 도움이 될 것이라고 생각합니다.각 클라이언트에 대해 200kb/s 이상의 속도가 필요한 경우 몇 가지 사항을 다시 생각해 볼 수 있습니다.

  4. 서버 로드.이것도 중요합니다. 일반 게임의 경우 서버에서 얼마나 많은 처리가 필요한가요?이를 실행하려면 16GB RAM을 갖춘 슈퍼 8코어 서버가 필요합니까?줄이는 방법이 있나요?

더 많은 것이 있을 것 같지만 실제로는 네트워크와 다양한 연결을 통해 편안하게 플레이할 수 있는 게임을 원합니다.

계획은 가장 친한 친구입니다.귀하의 진정한 요구 사항이 무엇인지 파악하십시오.

데이터 로드 중:모든 컴퓨터는 동일한 모델과 그래픽을 갖게 되며 이름과 위치만 네트워크를 통해 이동됩니다.모든 플레이어가 자신의 캐릭터나 기타 아이템을 맞춤 설정할 수 있다면 이 데이터를 이동해야 합니다.

부정행위:그것에 대해 걱정해야합니까?각 고객이 말하는 것을 믿을 수 있습니까?그렇지 않은 경우 서버 측 논리는 클라이언트 측 논리와 다르게 보일 것입니다.이 간단한 경우를 상상해 보십시오. 10명의 플레이어 각각은 파워 업으로 인해 이동 속도가 다를 수 있습니다.부정 행위를 최소화하려면 각 플레이어가 서버의 통신 업데이트 사이에서 얼마나 멀리 이동할 수 있는지 계산해야 합니다. 그렇지 않으면 플레이어가 해킹하여 속도를 높일 수 있으며 아무것도 막을 수 없습니다.플레이어가 지속적으로 예상보다 약간 빠르거나 일회성 점프가 있는 경우 서버는 가능한 가장 가까운 위치에 플레이어의 위치를 ​​변경합니다. 이는 시계 왜곡 또는 일회성 통신 중단일 가능성이 높기 때문입니다.그러나 플레이어가 지속적으로 가능한 한 두 배 더 멀리 이동한다면 게임에서 쫓아내는 것이 현명할 수 있습니다.수학이 많을수록, 서버에서 다시 확인할 수 있는 게임 상태의 더 많은 부분이 있을수록 게임의 일관성은 더욱 높아질 것이며, 부수적으로 이로 인해 부정행위가 더 어려워질 것입니다.

P2P 방식은 다음과 같습니다.게임이 P2P 방식으로 진행되더라도 한 명의 플레이어가 게임을 시작하고 이를 서버로 사용하도록 하고 싶을 것입니다. 이는 클라우드 기반 접근 방식을 관리하는 것보다 훨씬 쉽습니다.서버가 없으면 게임 상태가 일치하지 않는 두 컴퓨터 간의 분쟁을 해결하기 위한 프로토콜을 작업해야 합니다.

다시 한번 계획을 세우는 것은 당신의 가장 친한 친구인 계획, 계획, 계획입니다.문제에 대해 충분히 생각하면 대부분의 문제를 해결할 수 있습니다.그런 다음 아직 해결하지 못한 문제에 대해 생각해 볼 수 있습니다.

부정행위를 피하는 것이 얼마나 중요합니까?[클라이언트로부터 오는 모든 정보를 신뢰할 수 있습니까, 아니면 신뢰할 수 있고 인증될 수 있습니까?]

객체 모델한 기계에서 다른 기계로 객체가 어떻게 전달됩니까?객체에 대한 작업은 어떻게 수행됩니까?

클라이언트/서버 또는 피어 투 피어를 수행하고 있습니까?

난수피어 투 피어를 수행하는 경우 잠금 단계를 유지하고 난수를 동기화해야 합니다.

클라이언트/서버를 수행하는 경우 지연을 어떻게 처리합니까?[추측 항법 ?]

네트워크 코딩에는 사소하지 않은 문제가 많이 있습니다.

무료로 코드를 다운로드할 수 있는 RakNet과 토론 그룹을 확인해 보세요.

LAN에서 실행하는 경우 TCP는 괜찮습니다.하지만 온라인으로 플레이하려면 UDP를 사용하고 TCP와 유사한 자체 레이어를 구현해야 합니다.NAT 라우터를 통과해야 합니다.

P2P 또는 클라이언트-서버 통신 중에서 선택해야 합니다.클라이언트-서버 모델에서는 동기화 및 세계 상태를 구현하기가 더 쉽지만 온라인에서 반응성이 부족할 수 있습니다.Pee-to-Peer에서는 더 복잡하지만 플레이어에게는 더 빠릅니다.

게임 목적으로 플레이어 행동 내역을 보관하지 마십시오. 단, 재생 기능을 위해서만 보관하십시오.필요한 지점에 도달하면 모든 플레이어를 기다리게 하는 것이 좋습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top