Як поводитися з випадковим рухом у режимі реального часу за допомогою прогнозування на стороні клієнта


10

Я будую багатокористувацьку гру в реальному часі, яка виконує ту саму петлю фізики на клієнті та сервері. Я використовую поведінку керма "блукаю", що є важливим випадковим рухом. Клієнт і сервер генерують різні випадкові числа під час роботи алгоритмів блукань.

Мені цікаво, як я можу утримати природне випадковий рух, але використовувати деяку константу, яка забезпечить клієнта та сервера дійти одного і того ж висновку.


4
Генерувати ту саму випадкову послідовність із псевдовипадкової послідовності чисел легко. Важкою справою є синхронізація використання цієї послідовності. Вам потрібно зробити свою логіку гри детермінованою, не в тому сенсі, що ви не використовуєте випадкову послідовність, а використовувати випадкову послідовність детерміновано. Найпростіший спосіб досягти цього, як правило, уникнути сукупності в логічному циклі гри, однак можливо мати сумісність до тих пір, поки потоки не залежать від часу та послідовності PRNG, коли запитують PRNG про випадкове значення. Тут буде дракон.
Лежи Райан

Відповіді:


14

Можна використовувати випадкове насіння . Виберіть однакове 32-бітове значення на сервері та клієнті (або сервер може надіслати його клієнту на початку). Використовуйте його як насіння для випадкового генератора. Ви можете надіслати фактичне насіння з сервера на клієнта з оновленням стану гри. Якщо ви не хочете надсилати його, ви повинні бути впевнені, що клієнт і сервер генерують однакову кількість випадкових чисел цим випадковим генератором.

Що слід знати, перш ніж ви вирішили не надсилати фактичне насіння клієнту:

  • У вас виникнуть проблеми з вилученням персонажів на клієнта (значить, не обробляйте символів глибоко в тумані війни з клієнтом). Якщо ви хочете прийняти вимкнення символів, найкращим рішенням буде надсилання всього стану символів (з фактичним насінням) з сервера до клієнта, коли клієнт повинен обробити персонаж. Отже, сервер повинен вирішити, коли клієнт повинен обробляти характер, а коли не повинен. Будьте впевнені, що використовуєте окремі випадкові генератори для кожного символу.
  • Така ж проблема буде і з AI-лодами.
  • Випадкове число від цього випадкового генератора повинно генеруватися лише в оновленні з фіксованою дельтою часу. Якщо ви хочете використовувати випадкову цифру для інтерполяції AI перед візуалізацією, ви повинні використовувати окремий генератор випадкових випадків (на сервері немає візуалізації, тому небайдуже, яке насіння ви будете використовувати).
  • Якщо ви хочете використовувати різні платформи для клієнта та сервера (наприклад, C ++ та Java), ви повинні впровадити (або знайти) генератор міжплатформових випадкових генераторів. Це не є великою проблемою, адже випадкові генератори прості у впровадженні.

3

Якщо і сервер, і клієнт домовляться про початкове середовище, більшість алгоритмів рандомізації виведе однакові значення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.