Wdrożenie wygładzania sieci

13

Robimy multiplayerową strzelankę FPS. Klient wysyła swoją pozycję do serwera ze stałą szybkością (obecnie 10 Hz). Serwer wysyła pojedynczy komunikat o wszystkich pozycjach gracza do wszystkich graczy w tym samym tempie (10 Hz).

Zgodnie z oczekiwaniami ruch jest dość niepewny, ponieważ gra 60 klatek na sekundę otrzymuje aktualizacje tylko 10 razy na sekundę. Jaki jest najlepszy sposób na wygładzenie tego ruchu? Najbardziej oczywistym sposobem byłaby interpolacja między dwoma ostatnimi pakietami, aby interpolacja zakończyła się, gdy otrzymujemy nowy pakiet. Dodaje to jednak natychmiastowe opóźnienie 100 ms dla wszystkich graczy.

Innym sposobem byłoby użycie prędkości i przyspieszenia uzyskanych z kilku ostatnich pakietów, aby przewidzieć, gdzie znajduje się gracz przed nadejściem następnego pakietu, jednak jeśli prognoza jest błędna, gracz skacze, gdy tylko otrzyma nowy pakiet .

Czy ktoś wie, jak tytuły AAA rozwiązują ten problem?

Hannesh
źródło

Odpowiedzi:

9

Robią dokładnie to, co właśnie powiedziałeś - albo jedno z tych dwóch podejść, albo jakiś kompromis między nimi. (np. akceptuj małe opóźnienie i interpoluj, jeśli to możliwe, i ekstrapoluj, gdy ping przekroczy to opóźnienie.) Zamiast przeskakiwania (znanego również jako „przyciąganie”) z powrotem do skorygowanej pozycji, zwykle wykonujesz jakąś interpolację między błędną prognozą oraz skorygowaną wartość, jeśli to możliwe, wygładzając ją. W przeszłości zajmujesz się także korektami, aby zmniejszyć liczbę korekt, które musisz zastosować.

To jest często zadawane pytanie i istnieje kilka kanonicznych linków, które prawdopodobnie znajdziesz gdzie indziej na gamedev.stackexchange.com, jeśli szukasz, i obejmują one:

Co każdy programista powinien wiedzieć o tworzeniu sieci gier (podsumowuje to w dwóch kolejnych linkach)

Źródło sieci dla wielu graczy

Unreal Networking Architecture

Kylotan
źródło