Interpolacja między dwoma stanami sieciowymi?

11

Mam wiele bytów po stronie klienta, które są symulowane (ich prędkości są dodawane do ich pozycji na podstawie ramki) i pozwalam im umrzeć. Wysyłają informacje o tym, gdzie ostatnio byli widziani oraz o zmianach prędkości. Działa to świetnie, a inni gracze widzą tę pracę. Jednak po pewnym czasie gracze ci zaczynają desynchronizować się po pewnym czasie. Wynika to z opóźnienia.

Chciałbym wiedzieć, w jaki sposób mogę interpolować między stanami, aby wydawały się znajdować we właściwej pozycji. Wiem, gdzie gracz był OSTATNI, a jego aktualna prędkość, ale interpolacja do ostatnio widzianego stanu powoduje, że gracz faktycznie porusza się do tyłu. Nie mogłem w ogóle użyć prędkości dla innych klientów i po prostu „przeciągnąć” ich w odpowiednim kierunku, ale wydaje mi się, że spowodowałoby to nierówny ruch. Jakie są alternatywy?

Vaughan Hilts
źródło

Odpowiedzi:

9

Z tego powodu przekonasz się, że symulacje są często uruchamiane o 1 lub więcej klatek przed tym, co faktycznie jest renderowane w danym momencie na kliencie przekazującym. Innymi słowy, to, co renderujesz, może w rzeczywistości być ostatnią klatką, a nie ostatnią klatką.

Wyszukaj w tym artykule wszystkie wystąpienia słowa „naprzód” i myślę, że zaczniesz otrzymywać obraz lepiej, niż mogłem to wyjaśnić powyżej.

Inżynier
źródło
Okej, więc sugerujesz, że naprawdę powinienem renderować odtwarzacz tak jak 300 ms temu i interpolować go w przyszłość? (W osobnym stanie, gdy pojawi się nowy stan; to się zmieni)
Vaughan Hilts,
@VaughanHilts Znów proszę przeczytać artykuł i komentarze. Gaffer jest ekspertem w tej dziedzinie i wyjaśnia to znacznie jaśniej niż ja. Ale ogólną ideą jest to, że tak, twój model symulacyjny jest przed nami, podczas gdy rendering jest nieco za tym, aby uwzględnić opisany efekt. W żadnym wypadku nie jest to jedyne miejsce, w którym widziałem tę technikę.
Inżynier
2

Kiedy powiesz:

ci gracze zaczynają desynchronizować po pewnym czasie

sprawia, że ​​myślę, że twój problem może mieć więcej wspólnego z tym, że twoje zegary zaczynają działać krokowo niż z jakimikolwiek problemami z opóźnieniami. Jeśli to opóźnienie, na początku powinno być tak samo źle, jak za 10 minut. Jeśli jeden zegar w grze działa nieco szybciej niż drugi, pojawią się dziwne artefakty jittera, które z czasem będą się pogarszać. Klient może symulować w przyszłości, kiedy obecne pakiety dotrą z serwera, odciągnie klienta z powrotem, powodując przeskakiwanie jednostek. Przeprowadź więcej testów, aby się dowiedzieć.

Jeśli niezsynchronizowane zegary gry są rzeczywiście problemem, musisz bardzo uważnie przyjrzeć się pętli aktualizacji i upewnić się, że każda aktualizacja opiera się na ilości czasu spędzonego w grze (stałej lub zmiennej) oraz że gra -time jest zaawansowany przy użyciu czegoś takiego jak zegar ścienny (nie renderuje czasu ani innych zmiennych). Gaffer ma na ten temat kilka dobrych artykułów , a tutaj jest dobre pytanie, które mówi o stałych i zmiennych krokach czasowych . Mam nadzieję że to pomoże.

John McDonald
źródło
Tak nie jest, tak naprawdę jest to fakt, że uważam za zbyt daleko (opóźnienie lub coś w tym rodzaju - pakiet do „zatrzymania” nie jest odbierany na czas, a klient nie może sam się z czasem skorygować. sprawa, ponieważ po zatrzymaniu się klienta mogę najbardziej DEFINTELAY interpolować z powrotem na pozycję
Vaughan Hilts