p2p 멀티 플레이어 게임을 만들려면 어떻게해야합니까? 서버리스 멀티 플레이어 게임을하고 싶습니다. 그렇다면 모든 고객이 어떻게 서로를 알고 있습니까?
왜 p2p 프로토콜이 파일 전송에서 그렇게 유명하지만 멀티 플레이어 게임에서는 그렇지 않습니까?
p2p 멀티 플레이어 게임을 만들려면 어떻게해야합니까? 서버리스 멀티 플레이어 게임을하고 싶습니다. 그렇다면 모든 고객이 어떻게 서로를 알고 있습니까?
왜 p2p 프로토콜이 파일 전송에서 그렇게 유명하지만 멀티 플레이어 게임에서는 그렇지 않습니까?
답변:
피어 투 피어 게임에는 일반적으로 여전히 게임 호스트가 있습니다. 마스터 게임 목록에 게임을 게시하고 새로운 연결을 수락하는 게임 호스트입니다. 게임 호스트는 게임에 대한 새 클라이언트를 수락 할 때마다 모든 기존 클라이언트에게 새 클라이언트에 대해 알리므로 새 클라이언트에 연결할 수 있습니다.
p2p를 구현하는 가장 간단한 방법은 로비를 이용하는 것입니다. 모든 클라이언트는 로비 (또는 대화방)에서 호스트에 연결합니다. 호스트가 준비되면 플레이어가 시작을 누르고 모두 동시에 게임에 들어갑니다 (일반적으로 전략 게임에 사용됨). 보다 복잡한 접근 방식은 플레이어가 게임 중반에 참여하고 탈퇴 할 수있는 "드롭 인 드롭 아웃"을 사용하는 것입니다. 그러나 이것은 p2p 게임에서 구현하기가 훨씬 더 복잡하며 호스트 마이그레이션이라는 기능이 필요합니다.
대부분의 전략, 스포츠 및 드라이빙 타이틀을 포함하여 많은 게임이 P2P 네트워킹을 사용합니다. 거의 모든 Xbox360 및 PS3 게임은 p2p 네트워킹을 사용합니다. 클라이언트-서버 아키텍처는 주로 1 인칭 슈팅 게임 또는 MMO 게임에서 사용됩니다.
클라이언트-서버는 일반적으로 하나의 머신 만이 전체 게임 상태를 알지 못하기 때문에 구현하기가 더 쉬우 며, 클라이언트는 기본적으로 상황을 매끄럽게 보이도록 예측하는 렌더러 일뿐입니다.
p2p 엔진을 빌드 할 때 모든 클라이언트는 게임 세계의 전체 상태가 필요하며 모두 동기화 상태를 유지해야합니다.
p2p 및 클라이언트-서버 아키텍처에 대한 자세한 내용은 다음 기사를 읽어보십시오. 모든 프로그래머가 게임 네트워킹에 대해 알아야 할 내용 .
네트워킹에 익숙하지 않다면 해당 사이트의 다른 훌륭한 기사를 확인하십시오. 글렌은 네트워킹 천재입니다.
피어 투 피어 시스템 및 액션 게임에는 몇 가지 흥미로운 측면이 있습니다. 글렌 피들러 (Glenn Fiedler)의 블로그에 댓글로 글을 올리려고했지만, 그는 틀렸다는 것을 좋아하지 않고 대신 전체 기사를 가져 왔습니다. 읽고 싶을 경우 인터넷 아카이브에 있습니다.
그는 의견을 온라인으로 보내지 않았으므로 여기에 인용하겠습니다.
첫 번째 게시물의 Peer-to-Peer 제안은 때로는 약간 순진하지만 실제로 흥미로운 출발점입니다. 첫 번째 가능성은 시스템을 표준 클라이언트 / 서버 모델과 예측에 설명 된대로 결합하는 것입니다. 게임 네트워킹에 대해. P2P 핑이 낮을수록 위치에 따라 플레이어 간의 예측 지연이 크게 줄어 듭니다. 대부분의 미국 게이머에게는 효과가 보이지 않을 수 있지만 유럽에서는 대부분의 서버에서 200+ 이상의 핑이 정상이며 직접 연결로 인해 유럽 서버의 예측 지연.
서버가없는 진정한 P2P 접근 방식은 좀 더 복잡합니다. 분산 네트워크의 주요 관심사는 일관성을 보장하는 것입니다. 특히 네트워크를 통해 전송 된 명령의 타이밍이 약간 다르거 나 부동 소수점 문제로 인해 시뮬레이션에 버터 플라이 효과가 발생할 수있는 경우 일관성이 보장됩니다. 각 객체 (플레이어, NPC 등)의 상태를 최소한 주기적으로 네트워킹하면 가능합니다. 모든 객체에 대해 한 번에 수행 할 필요조차 없으며 각 클라이언트가 특정 객체를 소유 할 수 있습니다. 특정 시간에 충분한 개체를 네트워킹하면 개체의 각 동기화간에 쌓이는 차이를 약 1 초 이상 동기화 간격으로도 관련성이 없어야합니다.
P2P 시스템의 두 번째 문제는 보안이지만이 경우 비교적 작은 수정으로 해결할 수 있습니다. 클라이언트는 물리 시뮬레이션을 사용하여 각 물리 객체의 오류 수준에 대한 정보를 수집 할 수 있습니다. 조작 된 물리학은 항상 더 큰 오류를 초래하므로 클라이언트는 단순히 "투표"하여 의심스러운 개체를 제어하는 피어와의 연결을 끊습니다. 또한 비 물리적 오브젝트에 대한 제어 메시지는 클라이언트의 중요성에 따라 클라이언트간에 전달됩니다. 플레이어 업데이트는 무작위로 전달 될 수 있으며, 중요하지 않은 업데이트는 항상 전송되지만 여전히 임의의 플레이어에게 전송되어야합니다. 이런 식으로 플레이어는 눈에 띄는 방식으로 속임수를 쓰려면 연결된 클라이언트의 많은 부분을 제어해야합니다.
[...]
http://www.devmaster.net/forums/showthread.php?t=14640 에서 참조하는 스레드를 찾을 수 있습니다 .
누군가 피어 투 피어가 방화벽 문제가 기사의 스레드 중 하나에 있다고 언급했다고 생각합니다. 가능한 해결책은 NAT-Punchthrough입니다.
- NAT Punchthrough 개요
- 네트워크 주소 변환기를 통한 피어 투 피어 통신
100 % 성공률은 없으므로 플레이어에게 포트를 열도록 지시해야합니다.
'진정한 피어 투 피어'게임 플레이의 좋은 예는 Starcraft와 같은 실시간 전략 게임입니다.
수백 개의 유닛 / 발사체가 움직이는 게임에서는 네트워크를 통해 다른 모든 플레이어에게 유닛 위치 / 상태를 반복적으로 전송하는 것은 실용적이지 않으므로 여기서 한 가지 해결책은 모든 플레이어가 (정확히 동일한) 시뮬레이션을 동기화하여 실행하는 것입니다.
한 플레이어가 액션을 수행 할 때, 명령 / 순서 ( 'Zergling to X, Y')는 다른 모든 플레이어에게 보내질 수 있으며, 시뮬레이션의 모든 인스턴스에서 1 초 후에 실행됩니다.
이 상황에서 플레이어의 연결이 끊어지면 서버 / 호스트가 게임을 실행할 필요가 없으므로 나머지 플레이어는 계속할 수 있습니다.
그러나 게임 동기화를 유지하는 것은 사소한 일이 아니며, 게임 로직 업데이트에 고정 된 시간 단계를 사용해야하며, 시뮬레이션이 분기되지 않도록 난수 생성기의 사용 및 시드에 매우주의해야합니다!
대부분의 실시간 전략 게임 (스타 크래프트 시리즈, 커맨드 앤 컨커 시리즈) 및 많은 FPS 게임 (Call of Duty : Modern Warfare 2)에서 사용하는 게임으로 유명하지 않다고 주장하는 것은 다소 혼란 스러울 것입니다.
그것은 게임에 대해 배우는 방법은 당신이 사용하거나 만드는 매치 메이킹 / 로비 서비스에 달려 있습니다. 그러나 일단 게임에 대해 알게 되더라도 다른 사람들보다 더 동등한 동료가 여전히있을 수 있습니다. 플레이하고자하는 3 명의 클라이언트, 하나는 열린 nat 뒤에, 2는 엄격한 (닫힌) nat 뒤에 있습니다. 열린 nat 피어는 다른 두 연결을 연결할 수 있습니다. 그러나 2 엄격은 서로 직접 연결할 수 없으므로 패킷을 릴레이하려면 열린 nat가 필요합니다. 열린 nat 피어가 게임에서 떨어지면 다른 릴레이를 찾거나 게임이 중단됩니다.
당신은 아마 권한이없는 서버로서 한 명의 플레이어 (우리는 그를 "호스트"라고 부릅니다)로 달리기를 원할 것입니다. 다른 모든 플레이어가 자신의 행동을 우리 호스트와 통신하게하고 호스트는 다른 플레이어에게 메시지를 전달합니다.
또한 호스팅 플레이어에 연결된 컴퓨터 목록을 전달하여 새 호스트를 삭제하면 다른 호스트와 통신을 시작할 수 있습니다.
smartfoxserver에 대한 문서 가 도움이 될 수도 있고 게임에서 사용하기를 원할 수도 있습니다. 별도의 클라이언트 및 서버 프로그램이 아닌 클라이언트 게임에 포함시키기 만하면됩니다.
이 문제에 약간 관심이 있습니다. 고전적인 클라이언트 서버 모델 대신 게임 P2P를 만드는 데 많은 문제가 있다고 말하고 있습니다. 그러나 p2p는 클라이언트 서버와 같지만 모든 피어는 서버가 될 수 있습니다. LAG에 대해 하나의 머신을 서버로 추가하면 많은 클라이언트가 서버에서 멀어 질 가능성이 더 있지만 p2p를 사용하면 로비에 추가 머신이 없으므로 대기 시간 테스트를 관리하고 최소한의 핑으로 그룹을 만들 수 있습니다. 트래픽 생성에 관해서는, 당신이 배운대로 클라이언트가 적은 것보다 적게 전송하도록 요청해야합니다. 나는 클라이언트가 다른 모든 클라이언트가 의미하는 것을 이해해야한다는 것을 의미합니다.
시스템 요구 사항이 낮은 비교적 단순한 외형의 mmorpg를 만드는 경우 게임 폴더의 내용과 파일 구성을 기반으로 "빈도"를 만드는 내부 프로그램을 만드는 것이 좋습니다. 이렇게하면 같은 "주파수"를 가진 사람들이 같은 채널에서 플레이하게됩니다. 수정, 조작 또는 일반 클라이언트는 분리됩니다. 이것은 네이티브 해킹이나 개조에만 적용되지만 모든 "벙어리"사기꾼을 포함한다고 확신합니다. 한 사람이 언급 한 오류 검사 방법과 결합하면 중재가 거의 필요하지 않습니다. 포트가가는 한, 포트 52225를 백그라운드 프로세스로 처리하여 트리거 포트없이 라우터에 연결되도록합니다.