Як компенсувати рухомі об’єкти прогнозуванням на стороні клієнта?


11

Я впроваджую ігровий сервер, який підтримує Starle-подібний ближній біт . Таким чином, у вас є судна, які летять і стріляють, із супер простою швидкістю / прискоренням / загасанням фізики для керування рухом.

введіть тут опис зображення

Я читав Valve, Gafferon і Gambetta і реалізував алгоритм Gambetta для прогнозування клієнтів:

введіть тут опис зображення

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

На жаль, це не дуже добре працює для моєї гри. Я вважаю, що це пов'язано з тим, що приклад Gambetta не враховує об'єкти, які вже рухаються, або команди, що оновлюються поетапно. (під "кроком" я маю на увазі кадр). Тож у моїй грі гравець натискає, щоб прискорити (вже рухається) корабель, який продовжує рух по клієнту, відправляє команду на сервер і, як правило, отримує світовий знімок з сервера на наступному кроці. Я отримую щось більше на кшталт:

введіть тут опис зображення

Команда гравця виконується на кроці 3 клієнта , але на сервері виконується лише на кроці 5 сервера . На момент отримання клієнтом світового знімка на етапі 6 клієнта прогнозування закінчується, особливо на більш швидких швидкостях.

Суть проблеми полягає в тому, що клієнт виконує команду на кроці 5 , але сервер виконує її на етапі 6 . Я подумав над тим, щоб, можливо, відправити клієнтський крок із командою, і змусити сервер відкататись та запустити команду з кроком часу клієнта. Це може призвести до ряду інших проблем - як, наприклад, що відбувається з командами, отриманими з моменту відкату, або як клієнти-обмани можуть скористатися, змінивши надісланий крок.

Читання і перегляд відео , як цей від Google згадує інший підхід, при якому ви поступово змінити позицію гравця, що збігається з знімка за кілька кроків.

Мої запитання:

  • Чи можете ви змусити алгоритм Gambetta працювати з постійним кроковим рухом? Або це концептуально несумісне з моєю грою?

  • Чи поступова інтерполяція через кроки - це правильний шлях? Якщо так, як ви інтерполюєте вже переміщуваний об’єкт з позиції клієнта, щоб він відповідав тому, що щойно отриманий від сервера?

  • Чи можуть ці методи, поступова інтерполяція та алгоритм Гамбетти працювати в тандемі чи вони взаємовиключні?


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

@MakuraYami Так - я почав писати статтю з описом рішення. Незабаром оновиться!
OpherV

Я більше працював над своїм проектом і знайшов корисне рішення та ще кілька хороших ресурсів, які розмовляли з цим питанням. Мені цікаво обговорити далі, порівняти рішення тощо. Повідомте мене, де я можу з вами зв’язатися :)
MakuraYami

@makurayami моє ім’я користувача в Gmail
OpherV

Відповіді:


5

Протягом шести місяців, як я задав це питання, я закінчив розробляти повноцінний ігровий сервер із відкритим кодом для вирішення цієї проблеми (та багатьох інших!): Http://lance.gg

введіть тут опис зображення

Тепер науково-дослідна робота дозволяє мені відповісти на мої власні запитання:

  • Чи можете ви змусити алгоритм Gambetta працювати з постійним кроковим рухом? Або це концептуально несумісне з моєю грою?

    Алгоритм Gambetta не буде працювати, коли рух об'єкта не буде детермінованим (від POV клієнта). Якщо на суб'єкт господарювання можуть впливати без участі фізики чи інших гравців, наприклад, необхідно скористатися більш детальним підходом.

  • Чи поступова інтерполяція через кроки - це правильний шлях? Якщо так, як ви інтерполюєте вже переміщуваний об’єкт з позиції клієнта, щоб він відповідав тому, що щойно отриманий від сервера?

    Це стосується іншої теми, а саме - узгодження клієнтів із оновленнями сервера. Поступова інтерполяція працює, але для дуже швидких темпів, таких як питання, краще реалізувати екстраполяцію

  • Чи можуть ці методи, поступова інтерполяція та алгоритм Гамбетти працювати в тандемі чи вони взаємовиключні?

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


1

Здається, ваша гра занадто "в реальному часі", щоб мислити з точки зору часових кроків. Я б подумав лише про "повороти", якщо гру можна вважати "покрокової". В іншому випадку просто відмовтеся від ідеї поворотів чи кроків. Тоді все стає простіше :)

Зауважте, що ви прогнозуєте локально свого гравця та інтерполюєте лише для інших об'єктів (як це пояснено у 3-й статті серії). Спосіб боротьби з оновленнями сервера для об’єктів, які вже рухалися, - це узгодження на стороні сервера, пояснене в нижній половині 2-ї статті (тієї, яку ви пов’язали).

Сподіваюся, це допомагає :)


Просто для уточнення - під "кроком" я маю на увазі "кадр", який працює 60 разів на секунду. Я називаю це кроком (а не фреймом), щоб відрізняти фактичну прогресію гри від візуалізації, і в ідеалі вони обидва синхронізовані зі швидкістю 60 в секунду. Я вже реалізував вашу версію примирення на стороні сервера, яка працює чудово. Це питання стосується лише судна гравця - який постійно рухається незалежно від команди гравця (через інерцію). Саме тут лежить моя складність. Будь-які думки з цього приводу? :)
OpherV

Рамки відрізняються від кроків. Кроки рухаються в постійному передбачуваному порядку. Кадри переміщуються з різною кількістю часу, тому будь-яка прогресія повинна бути помножена на дельта-час для цього кадру.
Тельр

@Tealr дійсно, саме тому я почав використовувати термін "крок" - я просто хотів зрозуміти, що використання "кроку" не обмежується покроковими іграми, і в моїй грі крок займає рівно 1 / 60 секунди незалежно від візуалізації.
OpherV

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