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


10

Я реалізую прогнозування на стороні клієнта. Більшість пояснень передбачає, що клієнт надсилає повідомлення типу " Перемістити гравця на 1 позицію ". Що робити, якщо я надсилаю повідомлення типу " Установити швидкість мого гравця на x "?

пояснювальна графіка;  показ відправлених повідомлень та обчислених позицій на клієнті та сервері протягом певного часу

На клієнті гравець встановлює власну швидкість (за прогнозами на стороні клієнта) перед тим, як це зробити сервер, в результаті чого двоє виходять із синхронізації. Ця проблема зберігається навіть з урахуванням середньої затримки.

Як я можу вирішити це?

Відповіді:


8

Вам слід надіслати зайві дані, що тут означає відправити позицію та швидкість. Навіть якщо ви не синхронізовані, той факт, що у вас є позиція та швидкість, дозволяє вам виправити траєкторію за допомогою функції інтерполяції.

Тоді використання деяких хитрощів, таких як затримка анімації, прискорень тощо, дозволяє приховати затримку.

Редагувати: Я припускаю, що сервер є авторитетним.


Дякую за вашу відповідь. Так, Сервер є авторитетним, але навіть якщо я надсилаю зайві дані зі своєю швидкістю, клієнт може виправити свої помилки, але я часто читаю такі речі, як "Якщо клієнт / сервер використовує спільний код для своїх об'єктів, помилки прогнозування ніколи не трапляться", але у моєму випадку вони ВИНАГО будуть злегка виникати, що спричинить заїкання в усьому.
Blu3

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

Це головна причина використання функції інтерполяції. Ви не можете уникнути затримки, тому вам доведеться плавно виправляти рух. Клієнт і сервер імітують світ, але клієнт повинен слухати сервер і виконувати виправлення. Деякі методи, використовувані в мережі Source Engine: developer.valvesoftware.com/wiki/Source_Multiplayer_Networking
Thelvyn

це коротко згадується і в цій розмові про Google, воно має отримати ідею через youtube.com/watch?v=Prkyd5n0P7k#t=18m47s
dreta

Я знайшов інше рішення для цієї конкретної проблеми. Я додаю час, коли клієнт застосував свій вклад до кожного пакету. Значення №1 матиме час: 0, а другий раз: 100. Тепер Сервер знає, що клієнт вчасно натиснув свою кнопку: 100, а не раніше.
Blu3
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.