2013-05-02 2 views
1

현재 P2P를 사용하여 네트워크 게임을 제작하고 있습니다. 게임의 속도가 빠르지 않아 전용 서버에 액세스 할 수 없으므로 P2P는 나에게 좋은 선택입니다. 온라인 도메인에 액세스 할 수 있습니다. 프로그래밍은 C++로 수행됩니다.PHP P2P 게임 클라이언트 추적기 만들기

P2P는 모든 종류의 중앙 집중식 서버 통신을 필요로하지 않는다고 Game Networking의 위험을 염두에 두었습니다. 그런 다음 '나는 어떻게 생각 하나, IP를 모른 채 다른 게임 사용자가 게임을 호스팅 할 수 있을까?'라고 생각했습니다. 내 생각은 이제 게임에 연결할 수있는 일종의 중앙 '허브'가 필요하다는 것입니다. IP 및 포트로 사용 가능한 피어 호스트 목록을 얻으려면이 허브를 사용해야합니다. 그런 다음 해당 호스트에 연결하고 UDP를 사용하여 데이터를 전송합니다 (연결이 불가능하다는 것을 알고 있지만 ENet에 대한 트릭이 있음). 내 생각이 완전히 터무니 없다면 알려주세요.

나는 내 온라인 도메인에서 매우 간단한 PHP 클라이언트 -IP-switch-thingy를 만들려고했다. 게임은 단지 내 개인 학습 목표를위한 것이기 때문에 2 ~ 3 명 이상을 끌어 들이지 않을 것입니다. 따라서 도메인에 대한 부하가 너무 많은 문제가되지는 않을 것이라고 생각합니다. 문제는 PHP를 사용하여 어떤 종류의 정보를 만드는 데 유용한 정보를 찾을 수 없다는 것입니다. 나는 '비슷한 질문들'을 살펴 보려고했지만, 여전히 많은 정보를 찾을 수 없다.

내 질문에 당신은 : 가능하면 PHP 게임 클라이언트/호스트 트래커를 어떻게 만들 수 있습니까? 당신은 이것에 대한 좋은 웹 사이트 또는 기사를 알고 있습니까?

참고로, ENet과 SFML, 신뢰할 수있는 UDP 패킷은 ENet, 패킷 작성기는 SFML의 조합을 사용하려고합니다. 그게 가능한 선택입니까?

+0

이 게임은 LAN에서만 또는 인터넷에서만 사용하기위한 게임입니까? –

+0

절대 최소값은 LAN이지만 인터넷을 통해 작동하는 것이 좋습니다. 사용자가 포트를 수동으로 열어야하는지 상관하지 않으며, 가능하면 좋겠다. –

+0

좋습니다. 따라서 네, 최소 중앙 집중화 된 서버가 필요합니다. 멀티 캐스팅/방송은 LAN 전용 게임의 경우 옵션이었습니다. –

답변

2

언제나처럼, 몇 가지 선택이 당신이 원하는대로 받아 들일 수 있습니다.

P2P 연결을 사용하는 것은 까다 롭지 만 특히 VOIP 및 멀티 플레이어 온라인 게임과 같은 대기 시간이 짧은 분야에서는 강력 할 수 있습니다.

정보와 연결된 플레이어와 관련된 상태를 처리 할 서버를 노출해야한다고 생각합니다. 이 부분에는 C++, 네트워킹에는 boost::asio을 사용하는 것이 좋습니다.이 두 가지를 사용하여 잘 설명 된 예제를 많이 찾을 수 있으며 매우 우수하고 강력하고 확장 가능하다는 것을 알 수 있습니다. 그러나 이것은 결국 당신에게 달려 있습니다.

이 구성 요소는 게임에 참여하거나 만들려는 게이머로부터 들어오는 연결을 수락하는 역할을합니다. 현재 연결되어있는 게임 및 사용자 목록을 보유하고 새로운 수신 플레이어가 사용할 수 있도록합니다.

아주 간단하지 않습니까? 이제 게임 아키텍처에 대한 선택이 필요합니다. 여기서는 플레이어간에 P2P 연결을 사용하거나 서버를 각 플레이어 간의 프록시로 사용합니다.

각 게임 플레이어에 관한 정보를 가진 서버는 플레이어간에 연결을 전달하는데 사용될 수있는 프록시

으로 서버. 이것은 서버이기 때문에 단일 실패 지점을 작성하기 때문에 확장 성 및 성능 측면에서 다소 비효율적이지만이 도메인에 대한 요구 사항이 적기 때문에 선택 사항 일 수 있습니다.

이 경우 서버는 게임에 참여하고 다른 모든 플레이어에게 메시지를 브로드 캐스트 할 때 새로운 소켓 (예 : 다른 소켓)을 받아 들일 수 있으므로 다른 플레이어 조인, 움직임, 촬영 ...

조금 복잡합니다 peer-to-peer 연결

. 서버는 현재 어떤 플레이어와 게임이 현재 존재 하는지를 알기위한 목적으로 사용되지만, 사용자 간의 연결을 관리 할 책임이있는 대신 단순히 게임에 참가하려는 플레이어에게 "이봐, 너는 새로운 게임에 참여하고 싶다면 10.20.30.40 "으로 연락하십시오. 공개 게임을 "주관하는"사람의 IP 주소입니다.

그러면 큰 어려움을 겪을 것입니다. 라우터 뒤에있는 경우 어떻게이 호스트와 통신 할 예정입니까? 들어오는 플레이어가 라우터간에 게임을 호스팅하는 컴퓨터에 도달 할 수있게하려면 클라이언트 측에 NAT- 통과 기능을 구현해야합니다.

UPnP's IGD (Internet Gateway Device)을 사용하여 일부 포트를 열어 원하는 컴퓨터로 리디렉션하도록 요청할 때 Skype를 사용하여이 문제를 해결하기위한 몇 가지 기술이 VOIP 응용 프로그램에서 사용됩니다. 이것은 시간이 걸리고 모든 라우터에서 구현되지 않기 때문에 까다로운 작업입니다. 따라서 잠재적으로 완전한 실패로 이어질 수 있습니다. 이 예제를 위해이 문제를 쉽게 극복하고 다음 문제를 해결할 수 있다고 가정 해 봅시다.

계산 된 게임을 호스팅하면 게임에 연결된 다른 플레이어와 현재 연결되어있는 다른 플레이어를 알릴 수 있습니다. 여기에있는 아이디어는 각 플레이어를 동기화 상태로 유지하기 위해 (즉, 움직임, 샷, 비공개 메시지 등) 업데이트에 대해 각 플레이어가 서로 이야기하는 것입니다.). 광고와 메시지가 다른 플레이어에게 방송되는 방법을 정의 할 수있는 주문 패킷 알고리즘 (UDP 또는 ENet을 사용하는 것이 좋음)을 구현할 수도 있습니다.

예를 들어 4 명이 연결된 경기를 예로 들어 봅니다. 호스트 , 앨리스 이웃, 뉴욕과 마이크 우리는이 예제의 목적을 위해 필요한 다른 사람에 살고있는 사람이있다.

앨리스는 먼저 밥의 게임에 연결하고, 밥과 앨리스가 경기의 현재 상태에 대한 정보를 교환 할 때마다 자신이 참가한 밥에게 경고합니다. 이제 톰이 들어 와서 밥에게 새로운 플레이어라고 알려주고, 밥에게 톰에게 다른 플레이어가 연결되어 있고 IP 주소 (앨리스)를 알려줍니다. 이제 Bob은 누군가가 연결되어 있고 자신의 IP 주소를 제공한다고 Alice에게 알립니다. Bob이 죽었다고 상상해보십시오. Bob이 Alice에게 말했습니다. 왜냐하면 Tom이 들어 오기 전에 먼저 그녀와 이야기하기 위해 사용 되었기 때문입니다. 그리고 Bob이 방금 죽었다는 것을 Tom에게 알릴 필요가있는 것은 이제 Alice입니다.

모든 플레이어가 모든 플레이어에게 모든 광 고를 브로드 캐스트하도록 허용 할 수는 있지만 엄청나게 많은 양의 데이터를 처리 할 수 ​​있으며 일치하는 플레이어의 수만큼 확장 할 수 없습니다. 그래프을 P2P 환경에서 통신하는 데 훨씬 효율적일 수 있지만 설명하는 데 훨씬 더 많은 시간을 할애 할 수 있습니다.

나는 이러한 기술에 대해 내게 지적했다. 단순한 상태로 유지하려는 경우 고전적인 클라이언트 - 서버 아키텍처를 사용하고 처리해야하는로드를 제공하면 수용 할 수있는 것 이상이다.

Enjoy;)

+1

아,이 설명에 대해 고마워. :) P2P는 현재 나에게 너무 어려워 보인다. 이것은 내가 게임 네트워킹 (솔직히 말해서, 어떤 종류의 실제 네트워킹이든)을 해본 적이있는 나에게는 처음이다. 이 프로젝트는 게임 네트워킹 영역에 대한 일종의 '소개'여야합니다. 아마 어딘가에서 돌아 다니는 단순한 C++ 서버 응용 프로그램을 사용하는 것이 나을 것입니다. 이걸 네가 어떻게 생각하니? 당신의 대답을 받아 들였습니다. 정말로 감사합니다! 그러나 아직도 당신이 이것에 대한 당신의 생각을 알게 해주세요;) –

+0

나는 현재 플레이어를 기억하고 누가 누가 게임을하고, 누가 게임을 찾고, 각각의 필요에 따라 반응하는지 알고있는 서버를 사용할 것을 권장합니다 플레이어. 클라이언트 측에서는 SFML을 사용하는 것이 좋습니다. 처리 된 사용자/네트워크 이벤트에 따라 모든 UI를 관리해야합니다. 나는 이런 종류의 프로그램을 쓰는 것이 당신의 기술에 극히 유익 할 것이라고 생각합니다.) 나는 당신이하고 싶은 것에 동의합니다. –