Jak mogę stworzyć grę wieloosobową typu peer-to-peer? [Zamknięte]

37

Jak mogę stworzyć grę wieloosobową p2p? Chciałbym mieć grę wieloosobową bez serwera. Ale w jaki sposób wszyscy klienci znają się?

Dlaczego protokół p2p jest tak sławny w przesyłaniu plików, ale nie w grach dla wielu graczy?

Tuomas Hietanen
źródło
To, co może być bardzo interesujące w grze p2p, polega na stworzeniu kodu sieciowego, który będzie pasował do MMO, aby umożliwić lepsze aspekty społecznościowe: serwery byłyby potrzebne tylko dla miast i imprez z więcej niż 5 graczami. Nie wiem, co jest wykonalne, a co nie, ale obecnie jest to jedyna bardziej interesująca niż fotorealistyczna grafika ...
Jokoon
Ale p2p JEST dość popularny w grach wieloosobowych! Kto powiedział, że nie jest? Nawet niektóre duże MMO używają p2p
Adam Harte

Odpowiedzi:

34

Gry typu peer to peer zazwyczaj nadal mają hosta gier. Jest to gospodarz gry, który publikuje grę na głównej liście gier i akceptuje nowe połączenia. Ilekroć gospodarz gry akceptuje nowego klienta do gry, powiadamia wszystkich obecnych klientów o nowym kliencie, aby mogli upewnić się, że łączą się z nowym klientem.

Najprostszym sposobem na wdrożenie p2p jest lobby. Wszyscy klienci łączą się z hostem w lobby (lub pokoju rozmów). Gdy gospodarz jest gotowy, gracz naciska przycisk Start i wszyscy wchodzą do gry w tym samym czasie (powszechnie stosowane w grach strategicznych). Bardziej złożonym podejściem jest użycie „drop-in drop-out”, w którym gracze mogą dołączyć i opuścić środkową fazę gry, jednak jest to o wiele bardziej złożone wdrożenie w grze p2p i wymaga funkcji o nazwie migracja hosta.

Wiele gier korzysta z sieci peer-to-peer, w tym większość gier strategicznych, sportowych i kierowców. Prawie wszystkie gry Xbox360 i PS3 korzystają z sieci p2p. Architektura klient-serwer jest najczęściej używana w strzelankach FPS lub grach MMO.

Klient-Serwer jest generalnie łatwiejszy do wdrożenia, ponieważ tylko 1 komputer nie zna całego stanu gry, klienci są w zasadzie tylko rendererami z pewnymi przewidywaniami, aby wszystko wyglądało gładko.

Kiedy budujesz silnik p2p, wszyscy klienci potrzebują pełnego stanu świata gry i wszyscy muszą być zsynchronizowani.

Aby uzyskać więcej informacji o architekturze p2p i architekturze klient-serwer, sugeruję przeczytanie następującego artykułu: Co każdy programista musi wiedzieć o grach sieciowych .

A jeśli dopiero zaczynasz pracę w sieci, sprawdź inne świetne artykuły na tej stronie. Glenn jest geniuszem sieciowym.

Lloydw
źródło
13

Istnieje wiele powodów, dla których p2p nie jest popularny w grach, głównie z powodu lagów. Wszyscy są tak powolni jak najwolniejszy gracz. Nie mówimy tu o przepustowości, ale o czasie pingowania.

p2p może przesyłać tony danych, ale robi to przy dość wysokim pingu, gry muszą przesyłać bardzo małe ilości danych, przy minimalnym czasie pingowania.

Nate
źródło
13

Istnieje kilka interesujących aspektów dotyczących systemów peer-to-peer i gier akcji. Próbowałem opublikować je jako komentarz na blogu Glenna Fiedlera, ale najwyraźniej nie lubi, gdy się go nie myli i zamiast tego wyciągnąłem cały artykuł. Jest w archiwum internetowym, na wypadek, gdybyś chciał go przeczytać.

Nie pozwolił komentarzowi przejść do trybu online, dlatego zacytuję go tutaj:

Sugestia peer-to-peer z pierwszego postu jest w rzeczywistości interesującym punktem wyjścia, chociaż czasami jest nieco naiwna: pierwszą możliwością byłoby połączenie systemu ze standardowym modelem klient / serwer z prognozami opisanymi w poście o grze w sieci. Niższy ping P2P znacznie zmniejszyłby opóźnienie w przewidywaniu między graczami w zależności od ich lokalizacji: efekt prawdopodobnie nie byłby widoczny dla większości amerykańskich graczy, ale tutaj w Europie pingi 200+ są normalne na większości serwerów, a bezpośrednie połączenie zmniejszyłoby przewidywania są opóźnione w stosunku do serwera europejskiego.

Prawdziwe podejście P2P bez serwera jest nieco bardziej złożone: głównym problemem w zdecentralizowanych sieciach jest zapewnienie spójności, szczególnie jeśli symulacja mogłaby ucierpieć z powodu efektu motyla z powodu nieznacznie różnych czasów rozkazów wysyłanych przez sieć lub problemów zmiennoprzecinkowych. Jest to możliwe, łącząc stan każdego obiektu (graczy, NPC, ...) co najmniej okresowo. Nie byłoby nawet konieczne robienie tego dla wszystkich obiektów jednocześnie, a każdy klient mógł przejąć określone przedmioty. Łączenie wystarczającej liczby obiektów w określonym czasie powinno zlikwidować różnicę, która narasta między każdą synchronizacją obiektu na tyle, aby stała się nieistotna nawet dla interwałów synchronizacji trwających sekundę lub dłużej.

Drugim problemem związanym z systemami P2P jest bezpieczeństwo, ale w tym przypadku można je rozwiązać za pomocą stosunkowo niewielkiej poprawki: klienci mogą korzystać z symulacji fizycznych w celu gromadzenia informacji o poziomie błędu w każdym obiekcie fizyki. Manipulowana fizyka zawsze powoduje większy błąd, więc klienci po prostu „głosują”, aby rozłączyć się z peerem kontrolującym podejrzany obiekt. Ponadto komunikaty kontrolne dotyczące obiektów niefizycznych są przekazywane między klientami na podstawie ich ważności: Aktualizacje odtwarzacza mogą być przekazywane losowo, ważne i rzadkie aktualizacje powinny być zawsze wysyłane, ale nadal do losowego gracza. W ten sposób gracz musiałby kontrolować dużą część połączonych klientów, aby móc oszukiwać w zauważalny sposób.

[...]

Wątek, do którego się odwołuję, można znaleźć na stronie http://www.devmaster.net/forums/showthread.php?t=14640 .

Myślę, że ktoś wspomniał o problemach zapory sieciowej w sieci peer-to-peer w jednym z wątków tego artykułu. Możliwym rozwiązaniem byłoby NAT-Punchthrough:
- NAT Punchthrough przegląd
- Komunikacja peer-to-peer Across Tłumaczy Network Address

Nie ma 100% wskaźnika sukcesu, dlatego powinieneś powiedzieć graczom, aby otworzyli port.

Tamschi
źródło
+1 za jedyną osobę, która odpowie na pytanie, dziękuję za to. Jedno pytanie: wspomniałeś o różnicach między efektami motyla w balonie stanowym wymykającym się spod kontroli (widziałem, że dzieje się to w kilku źle napisanych grach Interplay). Co powinniśmy zrobić, gdy odkryjemy, że stan różni się między maszynami? Biorąc za przykład Starcraft, co jeśli mój komputer uważa, że ​​jedna jednostka zginęła, ale komputer mojego przeciwnika uważa, że ​​inna jednostka zmarła? Jak decydujemy, czyje słowo wziąć?
BlueRaja - Danny Pflughoeft
@BlueRaja Starcraft nie jest dobrym przykładem, ponieważ jego silnik jest w 100% deterministyczny. Musisz tylko niezawodnie przesyłać polecenia odtwarzacza ze znacznikami czasu, a komputery współużytkujące ten sam program zawsze będą zgadzały się z bieżącym stanem. Dobrym sposobem na zmniejszenie różnic jest znacznik czasu każdej aktualizacji stanu za pomocą gametime (ramka fizyki lub tik) i buforowanie kilku z tych ramek na maszynie odbierającej. (Większość gier FPS do tego, przykładami są CS: S i TF2.) Ponadto nie używaj liczb zmiennoprzecinkowych do niczego ważnego, ponieważ ich implementacja może się różnić.
Tamschi
Jeśli silnik jest w 100% deterministyczny (istnieją biblioteki fizyki, które to gwarantują.) I wykorzystuje buforowanie ramek do synchronizacji stanu między komputerami, efekt motyla ma wartość 0 (o ile można zagwarantować niezawodne połączenie.) Dodatkowy Zaletą jest to, że stosunkowo łatwo można zidentyfikować oszustów, ponieważ jedynym sposobem na uzyskanie różnych wyników byłoby posiadanie innego kodu. Pamiętaj, że może to nie być możliwe w przypadku każdego aspektu gry, w zależności od wydajności sieci; Z tego powodu zanieczyszczenia często nie są synchronizowane. Gry o szybkim tempie często nie są w stanie zsynchronizować wszystkiego.
Tamschi
Ponieważ post na blogu zniknął z pamięci podręcznej Google, jest on dostępny w internetowym archiwum: web.archive.org/web/20091120214817/http://gafferongames.com/…
fernozzle
9

Dobrym przykładem gry typu „peer-to-peer” jest gra strategiczna w czasie rzeczywistym, taka jak Starcraft.

W grze, w której poruszają się setki jednostek / pocisków, nie jest praktyczne wielokrotne wysyłanie pozycji / stanów jednostek przez sieć do wszystkich innych graczy, więc jednym z rozwiązań jest, aby wszyscy gracze uruchomili (dokładnie taką samą) synchronizację.

Gdy jeden gracz wykonuje akcję, polecenie / polecenie („przestaw zerowanie na X, Y”) może zostać wysłane do wszystkich innych graczy, które zostaną wykonane we wszystkich przypadkach symulacji ułamek sekundy później.

W tej sytuacji, jeśli jakikolwiek gracz rozłączy się, gra może być kontynuowana - ponieważ nie ma potrzeby uruchamiania serwera / hosta, pozostali gracze mogą kontynuować.

Jednak utrzymywanie synchronizacji gier nie jest trywialne, musisz użyć ustalonego timepeptu dla aktualizacji logiki gry i musisz być bardzo ostrożny z użyciem i inicjowaniem generatorów liczb losowych, aby zapewnić, że symulacje nie będą się różnić!

bluescrn
źródło
5

Byłoby nieco nieuczciwe twierdzenie, że nie jest znane z gier, w których wykorzystuje się większość gier strategicznych czasu rzeczywistego (seria Star Craft, seria Command and Conquer) i wiele gier FPS (Call of Duty: Modern Warfare 2).

To, jak uczy się o grze, zależy od usługi dobierania / lobbingu, z której korzystasz lub którą tworzysz. Ale nawet gdy ktoś pozna grę, nadal może istnieć jeden lub więcej rówieśników, którzy są bardziej równi od innych. Rozważ przypadek 3 klientów, którzy chcą grać, jednego za otwartym nat, 2 za surowymi (zamkniętymi) kotami. Otwarty użytkownik może odbierać połączenia od pozostałych dwóch. Ale 2 ścisłe nie mogą łączyć się bezpośrednio ze sobą, będą wymagały otwartego nat do przekazywania pakietów. Jeśli z gry spadnie osoba z otwartymi kontaktami, albo trzeba będzie znaleźć inny przekaźnik, albo gra zostanie zakłócona.

Doug-W
źródło
2

możesz również sprawdzić Badumna (www.badumna.com), która twierdzi, że jest rozwiązaniem sieciowym typu peer-to-peer do gier online. Wydaje się, że synchronizuje stan gry w sposób rozproszony i zgodnie z ich witryną nadchodzi wersja Flash.

Jan
źródło
1

Prawdopodobnie chcesz uruchomić z jednym graczem (nazywamy go „Hostem”) jako serwer nieautorytatywny. Wszyscy inni gracze będą komunikować się z naszym gospodarzem, co robią, a gospodarz przekaże wiadomości innym graczom.

Prawdopodobnie chcesz również przekazać listę komputerów podłączonych do odtwarzacza hostingowego, aby w razie upuszczenia nowy host mógł zostać wybrany i rozpocząć komunikację z pozostałymi graczami.

Dokumentacja smartfoxserver może ci pomóc i / lub możesz chcieć użyć jej również w swojej grze. Po prostu umieścisz go w swojej grze klienckiej zamiast osobnego programu klienta i serwera.

lathomas64
źródło
1
Wydaje się, że jest to mniej konfiguracja p2p, a bardziej improwizowany serwer / klient.
deft_code,
@caspin To jest większość, jeśli nie wszystkie gry p2p są uruchomione. Jeden gracz zostaje wyznaczony na gospodarza, a reszta łączy się z nim.
AttackingHobo
2
@Hobo: to nie p2p, który jest klient / serwer, bez względu na to jak to nazwać.
o0 ”.
1

Trochę mnie to interesuje. Mówisz, że istnieje wiele problemów z tworzeniem gry p2p zamiast klasycznego modelu klient-serwer. Ale jestem pewien, że p2p jest jak klient-serwer, ale każdy uczestnik ma szansę zostać serwerem. O LGD, jeśli dodasz jeszcze jedną maszynę jako serwer, istnieje większe prawdopodobieństwo, że wielu klientów jest dalej od serwera, ale używając p2p nie ma żadnych dodatkowych maszyn w lobby, możesz zarządzać testami opóźnień i tworzyć grupy z minimalnym pingiem. O generowaniu ruchu, jak się dowiedziałem, musisz poprosić klientów, aby transmitowali mniej niż mniej. Mam na myśli, że klienci muszą stwierdzić, że wszyscy inni klienci chcą to znaczyć.


źródło
gta4 na Xbox 360 jest p2p, więc jest to możliwe i nie ma prawie żadnego opóźnienia
-1

Jeśli tworzysz stosunkowo prosty mmorpg o niskich wymaganiach systemowych, sugeruję utworzenie wewnętrznego programu, który tworzy „częstotliwość” na podstawie zawartości folderu gry i tego, z czego składają się pliki. Dzięki temu ludzie z tą samą „częstotliwością” będą grać na tych samych kanałach. Zmodyfikowani, zmanipulowani lub normalni klienci zostaną rozdzieleni. Będzie to działać tylko w przypadku rodzimych hacków lub modów, ale jestem pewien, że obejmuje to wszystkich „głupich” oszustów. W połączeniu z metodą sprawdzania błędów, o której wspomniała jedna osoba, oznacza to niewielką lub żadną moderację. Jeśli chodzi o porty, wystarczy, że obejmują one port 52225 z procesem w tle, który utrzymuje go podłączonym do routerów bez portów wyzwalających.

Devin Foret
źródło