Wdrażam serwer gry, który obsługuje walkę wręcz podobną do Star Control . Więc masz statki latające i strzelające, z super prostą fizyką prędkości / przyspieszenia / tłumienia, która napędza ruch.
Przeczytałem Valve, Gafferon i Gambetta i zaimplementowałem algorytm Gambetta do przewidywania klientów:
Prognozowanie klienta działa na statku gracza, aktualizując jego pozycję z serwera w momencie jego dostarczenia, a następnie stosując ponownie nieprzetworzone dane wejściowe serwera na statku gracza.
Niestety nie działa dobrze w mojej grze. Uważam, że ma to związek z faktem, że przykład Gambetty nie uwzględnia obiektów, które już się poruszają, ani poleceń, które są aktualizowane krok po kroku. („krok” mam na myśli ramkę). Tak więc w mojej grze gracz naciska, aby przyspieszyć (już poruszający się) statek, który kontynuuje ruch na kliencie, wysyła polecenie do serwera i zwykle otrzymuje migawkę świata z serwera w następnym kroku. Dostaję coś więcej:
Polecenie odtwarzacza jest uruchamiane w kroku 3 klienta , ale na serwerze działa tylko w kroku 5 serwera . Zanim klient otrzyma migawkę świata w kroku 6 klienta , przewidywanie jest dalekie, szczególnie przy większych prędkościach.
Sedno problemu polega na tym, że klient uruchamia polecenie w kroku 5 , ale serwer uruchamia je w kroku 6 . Pomyślałem o wysłaniu kroku klienta z poleceniem, a serwer powinien wycofać się i ponownie uruchomić polecenie z krokiem czasu klienta. Może to jednak prowadzić do wielu innych problemów - takich jak to, co dzieje się z poleceniami otrzymanymi od wycofania, lub w jaki sposób oszukiwani klienci mogą wykorzystać, zmieniając wysłany krok.
Czytanie i oglądanie filmów takich jak ten z Google wspomina o innym podejściu, w którym stopniowo zmieniasz pozycję gracza, aby dopasować się do migawki w kilku krokach.
Moje pytania:
Czy potrafisz sprawić, by algorytm Gambetty działał przy stałym ruchu krokowym? Czy jest to koncepcyjnie niezgodne z moją grą?
Czy zatem stopniowa interpolacja kroków jest właściwą drogą? Jeśli tak, to w jaki sposób interpolujesz już poruszający się obiekt z pozycji klienta, aby dopasować go do tego, co właśnie otrzymał z serwera?
Czy te metody, stopniowa interpolacja i algorytm Gambetty mogą działać w tandemie, czy też wykluczają się wzajemnie?