Я реализую игровой сервер, который поддерживает Star Control-подобный рукопашный бой . Таким образом, у вас есть корабли, летающие и стреляющие, с супер простой физикой скорости / ускорения / демпфирования для управления движением.
Я прочитал Valve, Gafferon и Gambetta и реализовал алгоритм Gambetta для предсказания клиента:
Предсказание клиента работает на корабле игрока, обновляя его положение с сервера по мере его поступления, а затем повторно применяя еще не обработанные сервером входные данные к кораблю игрока.
К сожалению, это плохо работает для моей игры. Я полагаю, что это связано с тем, что пример Гамбетты не учитывает объекты, которые уже перемещаются, или команды, которые обновляются шаг за шагом. (под «шагом» я подразумеваю кадр). Поэтому в моей игре игрок нажимает, чтобы ускорить (уже движущийся) корабль, который продолжает двигаться на клиенте, отправляет команду на сервер и обычно получает снимок мира с сервера на следующем шаге. Я получаю что-то более похожее на:
Команда проигрывателя выполняется на шаге 3 клиента , но на сервере она запускается только на шаге 5 сервера . К тому моменту, когда на шаге 6 клиента будет получен моментальный снимок мира , предсказание уже далеко, особенно при более высоких скоростях.
Суть проблемы в том, что клиент запускает команду на шаге 5 , а сервер запускает ее на шаге 6 . Я подумал о том, чтобы отправить клиентский шаг с помощью команды, чтобы сервер откатился и повторно запустил команду с временным шагом клиента. Это может привести к множеству других проблем - например, что происходит с командами, полученными после отката, или как обманывать клиентов можно, изменяя отправленный шаг.
При чтении и просмотре видео, подобных этому от Google, упоминается другой подход, при котором вы постепенно меняете положение игрока в соответствии с моментальным снимком за несколько шагов.
Мои вопросы:
Можете ли вы заставить алгоритм Гамбетты работать с постоянным шаговым движением? Или это концептуально несовместимо с моей игрой?
Является ли постепенная интерполяция по шагам правильным путем? Если да, как вы интерполируете уже движущийся объект с позиции клиента, чтобы соответствовать тому, что только что было получено с сервера?
Могут ли эти методы, постепенная интерполяция и алгоритм Гамбетты работать в тандеме или они взаимоисключающие?