피어 투 피어 멀티 플레이어 게임을 만들려면 어떻게해야합니까? [닫은]


36

p2p 멀티 플레이어 게임을 만들려면 어떻게해야합니까? 서버리스 멀티 플레이어 게임을하고 싶습니다. 그렇다면 모든 고객이 어떻게 서로를 알고 있습니까?

왜 p2p 프로토콜이 파일 전송에서 그렇게 유명하지만 멀티 플레이어 게임에서는 그렇지 않습니까?


p2p 게임에서 매우 흥미로운 것은 MMO에 맞는 네트 코드를 만들고 더 나은 사회적 측면을 가능하게하는 것입니다. 서버는 5 명 이상의 플레이어가있는 도시와 당사자에게만 필요합니다. 나는 무엇이 실현 가능하지 않은지 모르지만 현재는 사실적인 그래픽보다 더 흥미로운 것입니다.
jokoon

그러나 p2p는 멀티 플레이어 게임에서 매우 인기가 있습니다! 그렇지 않다고 누가 말했습니까? 일부 큰 MMO조차도 p2p를 사용합니다
Adam Harte

답변:


33

피어 투 피어 게임에는 일반적으로 여전히 게임 호스트가 있습니다. 마스터 게임 목록에 게임을 게시하고 새로운 연결을 수락하는 게임 호스트입니다. 게임 호스트는 게임에 대한 새 클라이언트를 수락 할 때마다 모든 기존 클라이언트에게 새 클라이언트에 대해 알리므로 새 클라이언트에 연결할 수 있습니다.

p2p를 구현하는 가장 간단한 방법은 로비를 이용하는 것입니다. 모든 클라이언트는 로비 (또는 대화방)에서 호스트에 연결합니다. 호스트가 준비되면 플레이어가 시작을 누르고 모두 동시에 게임에 들어갑니다 (일반적으로 전략 게임에 사용됨). 보다 복잡한 접근 방식은 플레이어가 게임 중반에 참여하고 탈퇴 할 수있는 "드롭 인 드롭 아웃"을 사용하는 것입니다. 그러나 이것은 p2p 게임에서 구현하기가 훨씬 더 복잡하며 호스트 마이그레이션이라는 기능이 필요합니다.

대부분의 전략, 스포츠 및 드라이빙 타이틀을 포함하여 많은 게임이 P2P 네트워킹을 사용합니다. 거의 모든 Xbox360 및 PS3 게임은 p2p 네트워킹을 사용합니다. 클라이언트-서버 아키텍처는 주로 1 인칭 슈팅 게임 또는 MMO 게임에서 사용됩니다.

클라이언트-서버는 일반적으로 하나의 머신 만이 전체 게임 상태를 알지 못하기 때문에 구현하기가 더 쉬우 며, 클라이언트는 기본적으로 상황을 매끄럽게 보이도록 예측하는 렌더러 일뿐입니다.

p2p 엔진을 빌드 할 때 모든 클라이언트는 게임 세계의 전체 상태가 필요하며 모두 동기화 상태를 유지해야합니다.

p2p 및 클라이언트-서버 아키텍처에 대한 자세한 내용은 다음 기사를 읽어보십시오. 모든 프로그래머가 게임 네트워킹에 대해 알아야 할 내용 .

네트워킹에 익숙하지 않다면 해당 사이트의 다른 훌륭한 기사를 확인하십시오. 글렌은 네트워킹 천재입니다.


13

p2p가 게임에서 인기가없는 데는 여러 가지 이유가 있습니다. 가장 느린 선수만큼 느립니다. 여기서는 대역폭이 아니라 핑 시간에 대해 이야기하고 있습니다.

p2p는 많은 양의 데이터를 전송할 수 있지만 상당히 높은 핑 (ping)으로 게임은 최소 핑 시간으로 아주 적은 양의 데이터를 전송해야합니다.


13

피어 투 피어 시스템 및 액션 게임에는 몇 가지 흥미로운 측면이 있습니다. 글렌 피들러 (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 % 성공률은 없으므로 플레이어에게 포트를 열도록 지시해야합니다.


+1 만 질문에 답변하십시오. 감사합니다. 하나의 질문 : 당신은 통제 불능 상태에서 풍선 효과의 나비 효과 차이를 언급했습니다 (저는 잘못 작성된 Interplay 게임에서 발생했습니다). 상태가 머신마다 다르다는 것을 발견하면 어떻게해야합니까? 스타 크래프트를 예로 들어, 내 컴퓨터가 한 유닛이 죽었다고 생각하지만 상대방의 컴퓨터가 다른 유닛이 죽었다고 생각하면 어떻게해야합니까? 우리는 누구의 말을 받아 들일 것인가?
BlueRaja-대니 Pflughoeft

@BlueRaja Starcraft는 엔진이 100 % 결정적이므로 실제로 이에 대한 좋은 예는 아닙니다. 타임 스탬프와 함께 플레이어 명령을 안정적으로 전송해야하며 동일한 프로그램을 공유하는 컴퓨터는 항상 현재 상태에 동의합니다. 차이를 줄이는 좋은 방법은 게임 시간 (물리 프레임 또는 틱)으로 각각의 모든 상태 업데이트를 타임 스탬프하고 수신 시스템에 이러한 프레임 중 일부를 캐시하는 것입니다. (이것에 대한 대부분의 FPS 게임의 예는 CS : S 및 TF2입니다.) 또한 구현이 다를 수 있으므로 중요한 점에는 부동 소수점 숫자를 사용하지 마십시오.
Tamschi

엔진이 100 % 결정적 (이를 보장하는 물리 라이브러리가 있음)이고 컴퓨터에서 상태를 동기화하기 위해 프레임 캐싱을 사용하는 경우 버터 플라이 효과는 0이됩니다 (안정적인 연결을 보장 할 수있는 한). 다른 결과를 얻는 유일한 방법은 다른 코드를 사용하는 것이므로 부정 행위 클라이언트를 비교적 쉽게 식별 할 수 있다는 이점이 있습니다. 네트워크 성능에 따라 게임의 모든 측면에서 가능한 것은 아닙니다. 이러한 이유로 이물질이 동기화되지 않는 경우가 많습니다. 빠르게 진행되는 게임은 종종 모든 것을 동기화 할 수 없습니다.
Tamschi

블로그 게시물 이후 구글의 캐시에서 사라졌다 때문에, 여기에 인터넷 아카이브에 : web.archive.org/web/20091120214817/http://gafferongames.com/...
fernozzle

9

'진정한 피어 투 피어'게임 플레이의 좋은 예는 Starcraft와 같은 실시간 전략 게임입니다.

수백 개의 유닛 / 발사체가 움직이는 게임에서는 네트워크를 통해 다른 모든 플레이어에게 유닛 위치 / 상태를 반복적으로 전송하는 것은 실용적이지 않으므로 여기서 한 가지 해결책은 모든 플레이어가 (정확히 동일한) 시뮬레이션을 동기화하여 실행하는 것입니다.

한 플레이어가 액션을 수행 할 때, 명령 / 순서 ( 'Zergling to X, Y')는 다른 모든 플레이어에게 보내질 수 있으며, 시뮬레이션의 모든 인스턴스에서 1 초 후에 실행됩니다.

이 상황에서 플레이어의 연결이 끊어지면 서버 / 호스트가 게임을 실행할 필요가 없으므로 나머지 플레이어는 계속할 수 있습니다.

그러나 게임 동기화를 유지하는 것은 사소한 일이 아니며, 게임 로직 업데이트에 고정 된 시간 단계를 사용해야하며, 시뮬레이션이 분기되지 않도록 난수 생성기의 사용 및 시드에 매우주의해야합니다!


5

대부분의 실시간 전략 게임 (스타 크래프트 시리즈, 커맨드 앤 컨커 시리즈) 및 많은 FPS 게임 (Call of Duty : Modern Warfare 2)에서 사용하는 게임으로 유명하지 않다고 주장하는 것은 다소 혼란 스러울 것입니다.

그것은 게임에 대해 배우는 방법은 당신이 사용하거나 만드는 매치 메이킹 / 로비 서비스에 달려 있습니다. 그러나 일단 게임에 대해 알게 되더라도 다른 사람들보다 더 동등한 동료가 여전히있을 수 있습니다. 플레이하고자하는 3 명의 클라이언트, 하나는 열린 nat 뒤에, 2는 엄격한 (닫힌) nat 뒤에 있습니다. 열린 nat 피어는 다른 두 연결을 연결할 수 있습니다. 그러나 2 엄격은 서로 직접 연결할 수 없으므로 패킷을 릴레이하려면 열린 nat가 필요합니다. 열린 nat 피어가 게임에서 떨어지면 다른 릴레이를 찾거나 게임이 중단됩니다.


2

온라인 게임을위한 피어 투 피어 네트워킹 솔루션이라고 주장하는 Badumna (www.badumna.com)를 확인하십시오. 게임 상태 동기화를 분산 방식으로 수행하는 것으로 보이며 웹 사이트에 따라 플래시 버전이 제공됩니다.


1

당신은 아마 권한이없는 서버로서 한 명의 플레이어 (우리는 그를 "호스트"라고 부릅니다)로 달리기를 원할 것입니다. 다른 모든 플레이어가 자신의 행동을 우리 호스트와 통신하게하고 호스트는 다른 플레이어에게 메시지를 전달합니다.

또한 호스팅 플레이어에 연결된 컴퓨터 목록을 전달하여 새 호스트를 삭제하면 다른 호스트와 통신을 시작할 수 있습니다.

smartfoxserver에 대한 문서 가 도움이 될 수도 있고 게임에서 사용하기를 원할 수도 있습니다. 별도의 클라이언트 및 서버 프로그램이 아닌 클라이언트 게임에 포함시키기 만하면됩니다.


1
이것은 p2p 설정이 적고 즉석 서버 / 클라이언트가 더 많은 것 같습니다.
deft_code

@caspin 모든 p2p 게임이 실행되는 것은 아닙니다. 한 명의 플레이어가 호스트로 지정되고 나머지는 그에게 연결됩니다.
AttackingHobo

2
@Hobo :입니다 하지 P2P, 이다 클라이언트 / 서버, 당신이 전화를 아무리.
o0 '.

1

이 문제에 약간 관심이 있습니다. 고전적인 클라이언트 서버 모델 대신 게임 P2P를 만드는 데 많은 문제가 있다고 말하고 있습니다. 그러나 p2p는 클라이언트 서버와 같지만 모든 피어는 서버가 될 수 있습니다. LAG에 대해 하나의 머신을 서버로 추가하면 많은 클라이언트가 서버에서 멀어 질 가능성이 더 있지만 p2p를 사용하면 로비에 추가 머신이 없으므로 대기 시간 테스트를 관리하고 최소한의 핑으로 그룹을 만들 수 있습니다. 트래픽 생성에 관해서는, 당신이 배운대로 클라이언트가 적은 것보다 적게 전송하도록 요청해야합니다. 나는 클라이언트가 다른 모든 클라이언트가 의미하는 것을 이해해야한다는 것을 의미합니다.


X 박스 360에 GTA4는 가능하므로 P2P이며, 거의 지연이

-1

시스템 요구 사항이 낮은 비교적 단순한 외형의 mmorpg를 만드는 경우 게임 폴더의 내용과 파일 구성을 기반으로 "빈도"를 만드는 내부 프로그램을 만드는 것이 좋습니다. 이렇게하면 같은 "주파수"를 가진 사람들이 같은 채널에서 플레이하게됩니다. 수정, 조작 또는 일반 클라이언트는 분리됩니다. 이것은 네이티브 해킹이나 개조에만 적용되지만 모든 "벙어리"사기꾼을 포함한다고 확신합니다. 한 사람이 언급 한 오류 검사 방법과 결합하면 중재가 거의 필요하지 않습니다. 포트가가는 한, 포트 52225를 백그라운드 프로세스로 처리하여 트리거 포트없이 라우터에 연결되도록합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.