Как синхронизировать клиент и сервер при отправке изменений скорости игрока?

10

Я реализую предсказание на стороне клиента. В большинстве объяснений предполагается, что клиент отправляет сообщения типа « Переместить моего игрока на 1 позицию вверх ». Что если я отправлю сообщения типа « Установите скорость моего игрока на x »?

пояснительная графика;  отображение отправленных сообщений и вычисленных позиций на клиенте и сервере с течением времени

На клиенте игрок устанавливает свою собственную скорость (с помощью предсказания на стороне клиента) до того, как это делает сервер, что приводит к тому, что они не синхронизируются. Эта проблема сохраняется даже с учетом средней задержки.

Как я могу решить это?

Blu3
источник

Ответы:

8

Вы должны отправить избыточные данные, что здесь означает отправку позиции и скорости. Даже если вы не синхронизированы, тот факт, что у вас есть положение и скорость, позволяет вам скорректировать траекторию, используя функцию интерполяции.

Затем использование некоторых трюков, таких как отложенная анимация, ускорение и т. Д., Позволяет скрыть задержку.

Изменить: я предполагаю, что сервер является авторитетным.

Thelvyn
источник
Спасибо за Ваш ответ. Да, Сервер является авторским, но даже если я отправляю избыточные данные со своей скоростью, клиент может исправить свои ошибки, но я часто читаю такие вещи, как «Если клиент / сервер использует общий код для своих сущностей, ошибки предсказания никогда не произойдут», но в моем случае они ВСЕГДА будут происходить немного, что приведет к заиканию во всем.
Blu3
1
@ user13842 клиент всегда выйдет из синхронизации, вы должны исправить положение и скорость на стороне клиента, как сказал Телвин, в зависимости от того, какой сервер отправляет вас. таким образом, вы не получите заикания, если ваш клиент полностью не синхронизирован, тогда вам придется фиксировать значения, потому что исправление заняло бы слишком много времени.
dreta
Это основная причина использования функции интерполяции. Вы не можете избежать задержки, поэтому вы должны корректно корректировать движение. Клиент и сервер имитируют мир, но клиент должен слушать сервер и вносить исправления. Некоторые методы, используемые в сетях Source Engine: developer.valvesoftware.com/wiki/Source_Multiplayer_Networking
Thelvyn
это кратко упомянуто в этом выступлении Google, это должно быть
понято
Я нашел другое решение для этой конкретной проблемы. Я добавляю время, когда клиент применял свой ввод для каждого пакета. Значение # 1 будет иметь время: 0, а второй раз: 100. Теперь Сервер знает, что клиент нажал свою кнопку во время: 100, а не раньше.
Blu3