Najlepsza architektura gier peer-to-peer

10

Rozważ konfigurację, w której klienci gier:

  1. mają dość małe zasoby komputerowe (urządzenia mobilne, smartfony)
  2. wszystkie są podłączone do wspólnego routera (LAN, hotspot itp.)

Użytkownicy chcą zagrać w grę wieloosobową bez zewnętrznego serwera.

Jednym z rozwiązań jest hostowanie wiarygodnego serwera na jednym telefonie, który w tym przypadku byłby również klientem. Biorąc pod uwagę punkt 1, to rozwiązanie jest nie do przyjęcia, ponieważ zasoby obliczeniowe telefonu nie są wystarczające.

Chcę więc zaprojektować architekturę peer-to-peer, która rozłoży obciążenie symulacyjne gry między klientów. Z powodu punktu 2 system nie musi być skomplikowany pod względem optymalizacji; opóźnienie będzie bardzo niskie. Każdy klient może być wiarygodnym źródłem danych o sobie i jego najbliższym otoczeniu (na przykład punktory).

Jakie byłoby najlepsze podejście do projektowania takiej architektury? Czy są znane przykłady takiego protokołu peer-to-peer na poziomie sieci LAN?

Uwagi:

Niektóre z problemów są tutaj omówione , ale wymienione tam pojęcia są dla mnie zbyt wysokie.

Bezpieczeństwo

Wiem, że brak jednego wiarygodnego serwera jest problemem bezpieczeństwa, ale w tym przypadku nie ma to znaczenia, ponieważ jestem skłonny zaufać klientom.

Edytować:

Zapomniałem wspomnieć: będzie to raczej szybka gra (strzelanka).

Przeczytałem również o architekturach sieciowych w Gaffer on Games .

Dawid
źródło

Odpowiedzi:

10

Spojrzeć na ten artykuł na temat architektury sieciowej Age of Empires II.

Udało im się stworzyć grę wieloosobową, która świetnie działałaby na Pentium 90 z 16 MB pamięci RAM i połączeniem modemowym 28,8 kB / s. Zrobili to, każąc każdemu graczowi uruchomić własną symulację, ale zsynchronizować polecenia.

Mają tam kilka sprytnych sztuczek, gorąco polecam.

knight666
źródło
5

Zrobiłem to dla komercyjnej gry wyścigowej PSP, która działała zarówno w sieci ad hoc, jak i za pośrednictwem bezprzewodowego punktu dostępowego. (Lub do statycznego serwera w Internecie, jeśli to konieczne)

Z powodu punktu 2 system nie musi być skomplikowany pod względem optymalizacji

Z mojego doświadczenia to nie jest prawda. Urządzenia bezprzewodowe (zwłaszcza małe przenośne) nie są jak komputery z przewodowymi połączeniami sieciowymi - smartfony i bezprzewodowe konsole do gier mają zwykle powolne interfejsy sieciowe do celów gry.

Nie zrozum mnie źle - ich przepustowość jest zwykle dobra (to znaczy ilość danych na sekundę; świetna do przesyłania strumieniowego filmów itp.), Ale opóźnienie dostarczenia określonego pakietu może być bardzo złe i może być tak bardzo zmienna, że ​​trudno jest nawet oszacować, ile czasu zajmie dostarczenie dowolnego pakietu. Ta odmiana staje się jeszcze gorsza, gdy więcej urządzeń bezprzewodowych jest umieszczonych razem w jednym ogólnym obszarze, ponieważ ich sygnały zaczynają się wzajemnie zakłócać. W rezultacie sporo czasu spędziłem na zmniejszeniu liczby pakietów, które musiały zostać wysłane, abyśmy mieli mniej kolizji pakietów. (Należy pamiętać, że jest to nieco mniejszy problem w przypadku, gdy zaangażowany jest hotspot sieci zasilanej, zamiast gdy urządzenia komunikują się ze sobą bezpośrednio przez sieć ad hoc)

Jako przykład tego rodzaju optymalizacji nasza gra wyścigowa odbyła się w świecie, który miał sygnalizację świetlną. Tysiące z nich. Musieliśmy się upewnić, że ich sygnały są zsynchronizowane między wszystkimi graczami w sesji sieciowej. Zamiast próbować wysyłać pakiety z informacją, które światła były w jakim stanie, zdefiniowaliśmy statyczny harmonogram dla wszystkich świateł, a następnie upewniliśmy się, że wszyscy klienci zgodzili się na bieżący „czas gry”. Ponieważ wszyscy znali czas gry, a wszystkie stany sygnalizacji świetlnej można było ustalić na podstawie czasu gry, zsynchronizowaliśmy wszystkie te dane stanu, nie wysyłając żadnych specjalnych danych. Ta jedna zmiana zrobiła ogromną różnicę w wydajności naszej sieci.

To, co powiedziało, ustanowienie niezawodnej synchronizacji zegara między wieloma urządzeniami bezprzewodowymi (z bardzo różnymi czasami pingów spowodowanymi głównie utratą pakietów) było ogromnym wyzwaniem. Z przyjemnością porozmawiamy o tym więcej, jeśli jesteś zainteresowany.

Każdy klient może być wiarygodnym źródłem danych o sobie i jego najbliższym otoczeniu (na przykład punktory).

Tak właśnie zrobiliśmy i działało to dobrze w naszej sytuacji (samochody). Problematyczną częścią jest oczywiście sytuacja, gdy obiekt przestaje być bliżej gracza „a” niż gracza „b”, a jego własność przenosi się z jednego gracza na drugiego.

W rzeczywistości jest to zaskakująco skomplikowana negocjacja między graczami, w której gra „a” proponuje grę „b”: „Myślę, że ten obiekt jest bliżej ciebie. Powinieneś go przejąć”. I wtedy gra „b” może albo zaakceptować, albo odrzucić, w oparciu o własny pogląd na sytuację. Różnice w postrzeganym stanie gry między „a” i „b” oraz zmiana czasu między wysłaniem i otrzymaniem żądania i odpowiedzi sprawia, że ​​jest to wyjątkowo nieprzyjemna negocjacja w celu uzyskania wiarygodności i może łatwo przerodzić się w grę „gorący ziemniak”, a własność obiektu nieustannie podskakuje między wieloma graczami. I nawet jeśli działa poprawnie, patrząc z punktu widzenia gry „c”, tam „

Moją intuicją jest to, że tego rodzaju podejście do „posiadania obiektu” może być zbyt skomplikowane dla małych, krótkotrwałych obiektów, takich jak pociski. Użyliśmy go w samochodach drogowych i kierowcach AI, które żyły w symulacji przez stosunkowo długi czas. Wydaje się, że bardziej wydajnym podejściem, jeśli chcesz zaufać klientom, byłoby posiadanie przez każdego gracza swojej pozycji i pocisków oraz deklarowanie, kiedy gracz został trafiony pociskiem innej osoby. (Tak więc jako „gra A” jestem odpowiedzialny za określenie, gdzie znajdują się pociski gracza A i gracza A, ale gracz B jest odpowiedzialny za stwierdzenie, czy trafiłem gracza B). Przy pewnym dobrym liczeniu martwych powinieneś być w stanie uzyskać całkiem rozsądne zachowanie z takiego systemu.

Trevor Powell
źródło
1

Zalecam stosowanie architektury blokowania krok po kroku w architekturze peer to peer.

Zaczynasz od zliczenia klatek gry po rozpoczęciu gry. Jeden klient renderuje pierwszą ramkę, a następnie wysyła gotowy komunikat do innych klientów i czeka na otrzymanie gotowego komunikatu od innych klientów.

Teraz wszyscy klienci mogą przejść na drugą ramkę. Renderuj ramkę, wysyłaj i odbieraj polecenia, aktualizuj świat, aktualizuj fizykę i ... po tym wysyłając do siebie gotowe wiadomości.

To rozwiązanie jest bardzo dobre dla gier LAN i wszyscy twoi klienci będą zsynchronizowani.

z tego rodzaju siecią możesz być pewien, że wszyscy klienci są zsynchronizowani, dzięki czemu możesz przetestować najlepszy sposób, który odpowiada Twoim potrzebom.

Pierwszy sposób to wysyłanie danych wejściowych tylko do innych, a każdy klient symuluje uruchamianie, strzelanie, wykrywanie kolizji itp. Drugi sposób polega na tym, że każdy klient przesyła informacje o swojej postaci innym osobom, takie jak pozycja, obrót, stan, ramka animacji itp., Więc tylko inni klienci oblicza swoje rzeczy i wysyła je przez sieć, ale pierwszy sposób jest bezpieczniejszy.

kochol
źródło
1
Ta odpowiedź wydaje się dotyczyć pętli gry. Myślę, że OP pyta o system dystrybucji obciążenia; w szczególności, kto symuluje to, co i jak komunikują się klienci. Czy mógłbyś podać więcej szczegółów? Interesuje mnie również ten problem.
Wackidev
@Wackidev z tego rodzaju sieciami możesz być pewien, że wszyscy Twoi klienci są zsynchronizowani, dzięki czemu możesz przetestować najlepszy sposób, który odpowiada Twoim potrzebom. Pierwszy sposób to wysyłanie danych wejściowych tylko do innych, a każdy klient symuluje uruchamianie, strzelanie, wykrywanie kolizji itp. Drugi sposób polega na tym, że każdy klient przesyła informacje o swojej postaci innym osobom, takie jak pozycja, obrót, stan, ramka animacji itp., Więc tylko inni klienci oblicza swoje rzeczy i wysyła je przez sieć, ale pierwszy sposób jest bezpieczniejszy.
kochol
Więc proszę, umieść to w swojej odpowiedzi. W tej chwili nie sądzę, że to odpowiada na pytanie. Usuń również pierwszy duplikat komentarza. Dzięki. Co do samego pomysłu, czy pierwsza z wymienionych opcji nie wymaga determinacji symulacji?
Wackidev