Jak obsługiwać losowy ruch w czasie rzeczywistym z prognozami po stronie klienta

10

Tworzę grę wieloosobową w czasie rzeczywistym, która działa na tej samej pętli „fizyki” na kliencie i serwerze. Używam zachowania „kierowania”, które jest niezbędnym przypadkowym ruchem. Klient i serwer generują różne liczby losowe podczas uruchamiania algorytmów wędrówki.

Zastanawiam się, jak mogę zachować naturalnie losowy ruch, ale używam stałej, która zapewni klientowi i serwerowi ten sam wniosek.

kevzettler
źródło
4
Generowanie tej samej losowej sekwencji z pseudolosowej sekwencji liczb jest łatwe. Trudność polega na synchronizacji użycia tej sekwencji. Musisz sprawić, by logika gry była deterministyczna, nie w tym sensie, że nie używasz losowej sekwencji, ale żeby użyć losowej sekwencji w deterministyczny sposób. Najłatwiejszym sposobem na osiągnięcie tego jest zwykle uniknięcie współbieżności w pętli logicznej gry, jednak możliwe jest współbieżność, o ile wątki nie zależą od czasu i sekwencji PRNG, gdy prosi PRNG o losową wartość. Oto smok.
Lie Ryan,

Odpowiedzi:

14

Możesz użyć losowego materiału siewnego . Wybierz tę samą 32-bitową wartość na serwerze i kliencie (lub serwer może wysłać ją do klienta na początku). Użyj go jako nasionka dla generatora losowego. Możesz przesłać rzeczywiste ziarno z serwera do klienta z aktualizacją stanu gry. Jeśli nie chcesz go wysyłać, musisz mieć pewność, że klient i serwer wygenerują tę samą liczbę liczb losowych przez ten generator losowy.

Co powinieneś wiedzieć, zanim zdecydujesz się nie wysyłać faktycznego materiału siewnego do klienta:

  • Będziesz miał problemy z ubijaniem postaci na kliencie (oznacza to, że nie przetwarzaj postaci głęboko we mgle wojny na kliencie). Jeśli chcesz dokonać usuwania znaków, najlepszą decyzją będzie wysłanie całego stanu znaku (z faktycznym początkiem) z serwera do klienta, kiedy klient powinien przetworzyć znak. Tak więc serwer musi zdecydować, kiedy klient powinien przetwarzać znak, a kiedy nie. Upewnij się, że używasz osobnych generatorów losowych dla każdej postaci.
  • Ten sam problem dotyczy lokali AI.
  • Liczbę losową z tego losowego generatora można wygenerować tylko w aktualizacji ze stałą różnicą czasu. Jeśli chcesz użyć losowej cyfry do interpolacji AI przed renderowaniem, powinieneś użyć osobnego generatora losowego (nie ma renderowania na serwerze, więc nie przejmuj się, jakie ziarno użyjesz).
  • Jeśli chcesz używać różnych platform dla klienta i serwera (na przykład C ++ i Java), musisz zaimplementować (lub znaleźć) generator losowy typu crossplatform. To nie jest duży problem, ponieważ generatory losowe są łatwe do wdrożenia.
Kostya Regent
źródło
3

Jeśli zarówno serwer, jak i klient zgadzają się na ziarno, większość algorytmów losowych wygeneruje te same wartości.

Lince Assassino
źródło