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?
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?
Odpowiedzi:
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.
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.
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.
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ć!
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.
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.
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ć.
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.