최고의 P2P 게임 아키텍처


10

게임 클라이언트가있는 설정을 고려하십시오.

  1. 컴퓨팅 리소스가 매우 작습니다 (모바일 기기, 스마트 폰)
  2. 모두 공통 라우터 (LAN, 핫스팟 등)에 연결되어 있습니다.

사용자는 외부 서버없이 멀티 플레이어 게임을하고 싶어합니다.

한 가지 해결책은 한 대의 전화에서 권한있는 서버를 호스팅하는 것인데,이 경우 클라이언트이기도합니다. 포인트 1을 고려하면 전화의 컴퓨팅 리소스가 충분하지 않기 때문에이 솔루션을 사용할 수 없습니다.

따라서 클라이언트간에 게임 시뮬레이션 부하를 분산시키는 피어 투 피어 아키텍처를 설계하고 싶습니다. 포인트 2 때문에 시스템은 최적화와 관련하여 복잡 할 필요가 없습니다. 대기 시간이 매우 짧습니다. 각 고객은 자신과 직계 환경 (예 : 글 머리 기호)에 대한 권위있는 데이터 소스가 될 수 있습니다.

그러한 아키텍처를 설계하는 가장 좋은 방법은 무엇입니까? 이러한 LAN 레벨 피어 투 피어 프로토콜의 알려진 예가 있습니까?

노트:

일부 문제는 여기 에서 다루어 지지만 거기에 나열된 개념은 나에게 너무 높은 수준입니다.

보안

신뢰할 수있는 서버가 하나도 없다는 것은 보안 문제이지만 클라이언트를 기꺼이 신뢰하기 때문에이 경우에는 관련이 없습니다.

편집하다:

나는 언급을 잊었다 : 그것은 다소 빠르게 진행되는 게임 (슈터) 일 것이다.

또한 Gaffer on Games의 네트워킹 아키텍처에 대해 이미 읽었습니다 .

답변:


10

Age of Empires II의 네트워킹 아키텍처에 대한 이 기사를 살펴보십시오 .

그들은 16MB RAM과 28.8kB / s 모뎀 연결로 Pentium 90에서 잘 작동하는 멀티 플레이어 게임을 만들었습니다. 그들은 각 플레이어가 자신의 시뮬레이션을 실행하도록했지만 그들의 명령을 동기화함으로써 이것을했습니다.

그들은 거기에 영리한 트릭을 가지고 있습니다.


5

나는 애드혹 네트워크와 무선 핫스팟을 통해 작동하는 상업용 PSP 레이싱 게임을 위해이 작업을 수행했습니다. (또는 원하는 경우 인터넷의 정적 서버로)

포인트 2로 인해 시스템은 최적화와 관련하여 복잡 할 필요가 없습니다.

내 경험상 이것은 사실이 아닙니다. 무선 장치 (특히 소형 휴대용 장치)는 유선 네트워크 연결이있는 컴퓨터와 다릅니다. 스마트 폰과 무선 게임 콘솔은 게임 목적으로 네트워크 인터페이스 속도가 느린 경향이 있습니다.

오해하지 마십시오. 처리량은 일반적으로 좋으며 (즉, 초당 데이터 양, 스트리밍 영화 등에 좋습니다) 특정 패킷의 배달 대기 시간은 매우 나쁠 수 있으며 그렇게 될 수 있습니다 개별 패킷이 전송되는 데 걸리는 시간을 추정하기조차 어렵습니다. 이 변형은 신호가 서로 간섭하기 시작하면서 더 많은 무선 장치가 하나의 일반 영역으로 묶여 짐에 따라 더욱 악화됩니다. 그 결과 전송에 필요한 패킷 수를 줄이는 데 많은 시간을 들였으므로 패킷 충돌이 줄었습니다. (이는 장치가 Ad Hoc 네트워크를 통해 서로 직접 통신하는 대신 전원이 공급되는 네트워크 핫스팟이 관련된 경우에는 다소 문제가되지 않습니다.)

이런 종류의 최적화의 예로서, 우리 경주 게임은 신호등이있는 세계에서 열렸습니다. 그들 중 수천. 또한 네트워크 세션에서 모든 플레이어간에 신호가 동기화되어 있는지 확인해야했습니다. 모든 조명이 어떤 상태에 있는지 알려주는 패킷을 보내려고 시도하는 대신 모든 신호등에 대한 정적 일정을 정의한 다음 모든 클라이언트가 현재 "게임 시간"에 동의했는지 확인했습니다. 그들은 모두 게임 시간을 알았고 모든 신호등의 상태는 게임 시간에서 확인할 수 있었으므로 실제로는 특별한 데이터를 보내지 않고 모든 상태 데이터를 동기화했습니다. 이 변경으로 인해 네트워킹 성능이 크게 달라졌습니다.

그러나 여러 무선 장치간에 안정적인 클록 동기화 (패킷 손실로 인해 핑 시간이 크게 다름)를 설정하는 것은 큰 도전이었습니다. 당신이 관심이 있다면 그것에 대해 더 이야기 드리겠습니다.

각 고객은 자신과 직계 환경 (예 : 글 머리 기호)에 대한 권위있는 데이터 소스가 될 수 있습니다.

이것이 우리가 한 일이며 우리의 상황 (자동차)에서 잘 작동했습니다. 물론 문제는 객체가 플레이어 'b'보다 플레이어 'a'에 더 가깝게 멈추고 그 소유권이 한 플레이어에서 다른 플레이어로 이전되는 경우입니다.

이것은 실제로 게임 'a'가 게임 'b'를 제안하는 플레이어들 사이의 놀랍도록 복잡한 협상입니다. "이 개체는 당신에게 더 가깝다고 생각합니다. 당신은 그것을 통제해야합니다." 그리고 게임 'b'는 상황에 대한 자신의 견해에 따라 수락하거나 거절 할 수 있습니다. 'a'와 'b'사이의인지 된 게임 상태의 차이, 그리고 요청과 응답이 전송되고 수신되는 시간 사이의 변화는 신뢰성을 얻기 위해 특히 불쾌한 작은 협상을 만들어 내고, "핫 포테이토", 여러 플레이어 사이에서 개체 소유권이 계속 튀어 오릅니다. 그리고 게임 'c'의 유리한 지점에서 볼 때 제대로 작동하더라도

저의 직감은 이러한 종류의 "객체 소유권"접근 방식이 글 머리 기호와 같은 작고 수명이 짧은 개체에는 너무 번거 롭다는 것입니다. 우리는 교통 차량과 AI 레이서에 사용했으며 비교적 긴 시간 동안 시뮬레이션에 살았습니다. 클라이언트를 기꺼이 신뢰한다면 각 플레이어의 게임이 자신의 위치와 발사체를 소유하게하고 다른 플레이어의 발사체에 의해 때렸을 때 선언하는 것이보다 성능이 좋은 접근법처럼 보입니다. ( "게임 A"와 같이, 나는 플레이어 A와 플레이어 A의 발사체의 위치를 ​​말할 책임이 있지만 플레이어 B는 내가 플레이어 B를 때렸는지 말할 책임이 있습니다). 교착 상태가 좋으면 이와 같은 시스템에서 꽤 합리적인 행동을 취할 수 있습니다.


1

잠금 단계 피어 투 피어 아키텍처를 사용하는 것이 좋습니다.

게임이 시작된 후 게임 프레임을 세면서 시작합니다. 한 클라이언트는 첫 번째 프레임을 렌더링 한 후 준비 메시지를 다른 클라이언트에게 보내고 다른 클라이언트로부터 준비 메시지를 받기를 기다립니다.

이제 모든 클라이언트가 두 번째 프레임으로 이동할 수 있습니다. 프레임을 렌더링하고, 명령을주고받으며, 월드를 업데이트하고, 물리를 업데이트하고 ... 준비된 메시지를 서로 보낸 후.

이 솔루션은 LAN 게임에 매우 적합하며 모든 클라이언트가 동기화됩니다.

이러한 유형의 네트워킹을 사용하면 모든 클라이언트가 동기화되어 있는지 확인하여 필요에 가장 적합한 방법을 테스트 할 수 있습니다.

첫 번째 방법은 입력을 다른 사람에게만 보내고 각 클라이언트는 실행, 발사, 충돌 감지 등을 시뮬레이션합니다. 두 번째 방법은 각 클라이언트가 위치, 회전, 상태, 애니메이션 프레임 등과 같은 다른 캐릭터에게 자신의 캐릭터에 대한 정보를 다른 클라이언트에게만 보내는 것입니다 물건을 계산하고 네트워크를 통해 전송하지만 첫 번째 방법은 더 안전합니다.


1
이 답변은 게임 루프에 관한 것 같습니다. OP가 부하 분배 시스템에 대해 묻고 있다고 생각합니다. 구체적으로, 누가 클라이언트가 무엇을 어떻게 커뮤니케이션 하는지 시뮬레이션합니다 . 좀 더 자세히 설명해 주시겠습니까? 이 문제에도 관심이 있습니다.
Wackidev

@Wackidev는 이러한 유형의 네트워킹을 통해 모든 클라이언트가 동기화되어 있는지 확인하여 필요에 가장 적합한 방법을 테스트 할 수 있습니다. 첫 번째 방법은 입력을 다른 사람에게만 보내고 각 클라이언트는 실행, 발사, 충돌 감지 등을 시뮬레이션합니다. 두 번째 방법은 각 클라이언트가 위치, 회전, 상태, 애니메이션 프레임 등과 같은 다른 캐릭터에게 자신의 캐릭터에 대한 정보를 다른 클라이언트에게만 보내는 것입니다 물건을 계산하고 네트워크를 통해 전송하지만 첫 번째 방법은 더 안전합니다.
kochol

그래서 당신의 대답에 넣으십시오. 지금은 그것이 질문에 대답하지 않는다고 생각합니다. 또한 첫 번째 중복 의견을 삭제하십시오. 감사. 아이디어 자체에 관해서는, 첫 번째 옵션이 시뮬레이션을 결정 론적으로 요구하지 않습니까?
Wackidev 2016 년
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.