В настоящее время в моей игре клиент - не что иное, как рендер. Когда состояние ввода изменяется, клиент отправляет пакет на сервер и перемещает игрока, как если бы он обрабатывал ввод, но сервер имеет последнее слово в позиции.
Как правило, это работает очень хорошо, за исключением одной большой проблемы: падение с краев. По сути, если игрок идет к краю, скажем, с обрыва и останавливается прямо перед тем, как сойти с края, иногда через секунду, он будет телепортирован с края. Это связано с тем, что пакет «Я перестал нажимать W» отправляется после того, как сервер обработает информацию.
Вот диаграмма отставания, чтобы помочь вам понять, что я имею в виду: http://i.imgur.com/Prr8K.png
Я мог бы просто посылать пакет «W Pressed» каждый кадр для обработки сервером, но это, казалось бы, было дорогостоящим решением.
Любая помощь приветствуется!
источник
Я понимаю ваш вопрос как:
Сервер получает пакет, когда я начинаю нажимать кнопку «вперед», и другой пакет, когда я наконец отпускаю кнопку «вперед». Поэтому фактическое движение на сервере начинается и заканчивается примерно на 100 миллисекунд «слишком поздно» в реальной игре по сравнению с тем, что игрок выражает на стороне клиента. Поэтому, если игрок хочет переместиться на 10 секунд, он может переместиться на 10 секунд вместо того, чтобы быть в
x >= 1
сети.Это плохая стратегия дизайна, потому что она не выражает волю игрока в игровом мире, как того хочет игрок, создавая довольно плохой пользовательский опыт.
Решением, которое я бы порекомендовал, является отправка пакета (так часто, как вы можете), который показывает, сколько шагов сделал игрок и в каком направлении. Затем сервер обновляет игровой мир новым местоположением игрока, если он проходит проверку на правильность. Таким образом, игрок может двигаться с большой точностью и избегать падения с высоких уступов.
Альтернативой было бы запомнить позиции игрока в последнюю секунду и скорректировать позицию задним числом до момента, когда кнопка была отпущена. Звучит так, будто это создаст эффект прежней резинки (только по другой причине).
Таким образом, в основном вам нужно будет отправить пакет с нажатой кнопкой и каково было фактическое время игры, когда была нажата кнопка, а затем позже, какая кнопка была отпущена и в какое точное время.
источник