Реализация сетевого сглаживания

13

Мы делаем шутер от первого лица. Клиент отправляет свою позицию на сервер с фиксированной скоростью (в настоящее время на 10 Гц). Сервер отправляет одно сообщение с указанием позиций всех игроков всем игрокам с одинаковой частотой (10 Гц).

Как и ожидалось, движение довольно изменчиво, поскольку игра со скоростью 60 кадров в секунду получает обновления только 10 раз в секунду. Как лучше всего сгладить это движение? Наиболее очевидный способ - это интерполировать между двумя последними пакетами, чтобы интерполяция заканчивалась, когда мы получаем новый пакет. Но это добавляет мгновенную задержку в 100 мс для всех игроков.

Другой способ состоит в том, чтобы использовать скорость и ускорение, полученные из последних нескольких пакетов, чтобы предсказать, где находится игрок до прибытия следующего пакета, однако, если прогноз неверен, игрок будет склонен прыгать, как только будет получен новый пакет. ,

Кто-нибудь знает, как названия AAA решают эту проблему?

Hannesh
источник

Ответы:

9

Они делают именно то, что вы только что сказали - либо один из этих двух подходов, либо какой-то компромисс между ними. (например, принять небольшую задержку и интерполировать, где это возможно, и экстраполировать, когда пинг превышает эту задержку.) Вместо того, чтобы прыгать (также известный как «привязка») назад к исправленной позиции, вы обычно выполняете некоторую интерполяцию между неверным прогнозом и исправленное значение, сглаживая его, если это возможно. Вы также обрабатываете исправления в прошлом, чтобы уменьшить количество исправлений, которые вам нужно применить.

Это часто задаваемый вопрос, и есть несколько канонических ссылок, которые вы, вероятно, найдете в другом месте на gamedev.stackexchange.com, если будете искать, и они включают следующее:

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

Источник Многопользовательская сеть

Нереальная Сетевая Архитектура

Kylotan
источник