@DrSpritz

Как огранизуется сетевая синхронизация в авиасимуляторах и гонках?

Здравствуйте!

Недавно я решил добавить в одну из своих игр (космическая леталка-стрелялка-убивалка) мультиплеер. В теории вопросов больших у меня не возникало, все типично и достаточно легко. И в принципе все было хорошо, но когда дело дошло до сетевой синхронизации позиции игроков в виртуальном пространстве и тут я получил занозу в пятую точку.
Для реализации этой задачи я использовал стандартные подходы для синхронизации, отправлял по 10 пакетов в секунду и интерполировал позицию клиентов между полученными координатами, правда за чуть большее время (~110ms), дабы избежать подергиваний при сильных скачках пинга, но в итоге получал дополнительную задержку в добавок к пингу. И все работает в принципе сносно, кораблики ползают, крутятся, но... как только стоит разогнать кораблик до приличных скоростей, так сразу появляются проблемы, корабль начинает сильно колбасить, и чем больше скорость, тем сильнее кобласит. Пробовал увеличивать время интерполяции, кораблик в принципе себя начинал вести спокойнее, но разсинхронизация получается огромная, если двигаться за кем-то, то погрешность в реальном расположении получается порядка 5-7 корпусов корабля.
Ребят, я честно не знаю, возможно это нормально, хотя для каких-нить гонок, я думаю такие проблемы будут критичны.

Подскажите пожалуйста, как правильно будет решить проблему сетевой синхронизации для очень быстро движущихся игроков (гонки, авиасимуляторы)?

Спасибо!
  • Вопрос задан
  • 350 просмотров
Пригласить эксперта
Ответы на вопрос 2
@gawozi
Тебе позможно нужно сделать плавынй переход от одного положения до другого на клиенте
Ответ написан
@ndbn
Я думаю, все расчеты должны производиться на сервере и он должен сообщать клиентам положение их и соседних кораблей(в области видимости).
Например: сервер, клиент1, клиент2
начальное положение: клиент1 - 0 ед., клиент2 - 10
На сервере проходит тик(итерация), допустим корабли перемещаются на 2 ед.
Сервер делает рассылку(броадкаст) по эвенту либо по пинг-запросу
клиент1 получает: позиция клиент1 - 2 ед., позиция клиент2 - 12 ед.
клиент2 получает: позиция клиент1 - 2 ед., позиция клиент2 - 12 ед.

Как только клиенты получают эту информацию, они её отображают(перемещают модели и т.п.).
Таким образом сервер всегда знает точные положения кораблей, исключена возможность считерить и послать серверу информацию о ненастоящем местоположении.

(Справедливости ради скажу, что к геймдеву не имею никакого отношения)
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы