Na czym polega tworzenie platformowej gry wieloosobowej w czasie rzeczywistym?

13

Tworzę platformówkę, która ma funkcję „kooperacyjną”, którą chciałbym pracować w sieci / Internecie.

Teraz przeczytałem o programowaniu gier sieciowych, w tym artykuły, takie jak Co każdy programista powinien wiedzieć o sieciach gier, więc rozumiem różnicę między takimi technikami, jak blokowanie Peer-to-Peer i architektury przewidywania Serwer-Klient:

  • Doszedłem do wniosku, że dla każdej gry w czasie rzeczywistym, która będzie rozgrywana przez Internet, blokada Peer-to-Peer po prostu nie jest opcją.
  • Obawiam się również, że nawet dla platformówki prosta architektura klient-serwer (bez jakiejś prognozy klienta) spowodowałaby pogorszenie rozgrywki z powodu opóźnienia między akcją a reakcją spowodowanego podróżą w obie strony na serwer. (Powiedziawszy, że chcę wyeliminować potrzebę centralnego serwera, a więc tylko jeden z graczy, klient, rzeczywiście odczuje to opóźnienie).

To pozostawia prognozy dla klientów, ale nawet w przypadku prostej gry, takiej jak platformówka, nadal wydaje się to dość skomplikowane.

Jak mógłbym zacząć od stworzenia działającego systemu przewidywania klientów dla wieloosobowej gry platformowej?

Justin
źródło
1
Jedna rzecz, że będziesz miał dużo mniej się martwić w spółdzielni gra oszukuje;)
Jonathan Connell
Zaznaczyłem to jako mało konstruktywne. Zadane pytania („Ile pracy kosztuje napisanie gry sieciowej, która opiera się na prognozach klienta? Czy skończę z połową mojej bazy kodu składającej się z kodu sieciowego?”) Są zbyt obszerne i w ogóle nie dotyczą konkretnego problemu. Odpowiedź byłaby w zasadzie „to zależy”, co nie jest dobrą odpowiedzią.
TravisG,
-1, „Ile pracy” jest subiektywne.
Tetrad
1
Ile pracy nie jest subiektywne, ponieważ jest samodzielne, ale zależy od kilku czynników (rozmiar gry, wymagania dotyczące dokładności itp.) Te czynniki mogą mieć wpływ, jeśli jest to dużo pracy, trochę pracy lub gdzieś pomiędzy (chociaż jaki rodzaj pracy jest lepszym pytaniem); myślę jednak, że OP naprawdę pyta, ile wysiłku wymaga i jak duża część kodu będzie tego typu kodem. Jak to sformułowano, może być zbyt szeroki. Wybrałem wąską interpretację i odpowiedziałem na to. Uważam, że PO powinien włożyć nieco więcej wysiłku, aby zawęzić pytania do kilku bardzo konkretnych punktów.
Nate
@Tetrad Przykro mi - starałem się, aby to pytanie było jak najbardziej obiektywne, ale moje pytanie sprowadza się do „czy trudno jest stworzyć działający system predykcyjny klienta dla gry typu Y” - jeśli nie, to nauczę się jak ja idź, ale mój czas jest ograniczony, więc nauka, która jest zbyt pracochłonna po X dniach grania, jest zbyt późna. Chciałbym podać więcej szczegółów na temat Y, ale nie chcę, aby pytanie było „zbyt zlokalizowane”. Głównym problemem tutaj jest ruch, który jest wspólny dla wszystkich platformówek (chcę, aby inni uznali to pytanie za przydatne). Jeśli uda mi się poprawić to pytanie, sugestie są mile widziane.
Justin

Odpowiedzi:

5

Nie sądzę, że połowa twojej bazy kodu zamieni się w kod sieci, jeśli zdecydujesz się zaimplementować taką funkcję.

Moim zdaniem najprostszym sposobem na to jest skonfigurowanie „centralnego” serwera (nawet jeśli oznacza to, że jeden gracz „hostuje” grę, a następnie łączy się z własnym serwerem), który akceptuje wszystkie dane wejściowe użytkownika tak szybko, jak to możliwe i odsyła go z powrotem do każdego klienta.

Na kliencie wdrażasz to nie inaczej niż w przypadku lokalnej gry kooperacyjnej dla dwóch graczy, z tym wyjątkiem, że czytasz P1 z klawiatury i P2 z sieci.

Musisz od czasu do czasu wysyłać serwer do pełnego stanu gry, a obaj klienci mogą albo przejść do nowego stanu autoryzacji z serwera, albo mogą przejść do nowego stanu (przez kilka sekund). O ile nie masz strasznej utraty pakietów lub ton klientów na serwer, takie podejście powinno wystarczyć w zarysowanej sytuacji.

Nate
źródło
To jest tak proste, jak podejście Client Server (z wyjątkiem jednego klienta, który hostuje serwer -> nie potrzebujesz dedykowanego serwera, ale musisz przejść z czymś w rodzaju UDP + NAT Punchthrough, który i tak wymaga dedykowanego serwera). Po drugie, proponujesz metodę lockstep (gdy mówisz o wysyłaniu kompletnych gamestatów), nie jest to, IMHO, najlepsza metoda, jeśli gra działa przez Internet (prawdopodobnie jest to sieć LAN), gdzie klient-serwer jest znacznie łatwiejszy wdrożyć.
Valmond
1
Nie, sugeruję od czasu do czasu wysyłanie pełnych stanów gry, aby klient mógł się upewnić, że nie jest to zbyt odległe.
Nate
2

Mam w pełni funkcjonalną grę w stylu mMORPG z przewidywaniem klienta (gra jest daleka od ukończenia, ale działa „OK”) i mam coś wzdłuż 40 000 linii kodu dla serwera i podwójnego dla klienta (dodaj tę samą kwotę dla narzędzi itp. .). Prognozy to prawdopodobnie nie więcej niż kilkaset linii (jeśli nawet to), a cała sieć składa się z kilku tysięcy linii, ale nie więcej niż powiedzmy 5000 (zależy to trochę od tego, gdzie narysujesz linię).

Rozmyte pytanie rozmyta odpowiedź ;-)

Valmond
źródło
2

Znaczna część kodu sieciowego może być niezależna od gry, w którą grasz. Z tego powodu, a ponieważ jesteś nowy w sieci, pierwszą rzeczą, którą sugeruję, jest znalezienie bibliotek, które wykonają to za Ciebie. Na przykład RakNet.

Jedną rzeczą, której będziesz potrzebować w kodzie gry, jest możliwość obsługi wielu różnych stanów gry, których możesz użyć do interpolacji i przewidywania. Jest to dość proste do zaprojektowania z góry, ale może być znaczną pracą, jeśli modyfikujesz istniejącą grę dla jednego gracza.

Pamiętaj również, że jeśli chcesz, aby nieznajomi grali w peer-to-peer przez Internet, prawdopodobnie będziesz potrzebować przynajmniej jednego serwera, który obsługuje lobby / swatanie.

Adam
źródło