Как огранизуется сетевая синхронизация в авиасимуляторах и гонках?
Здравствуйте!
Недавно я решил добавить в одну из своих игр (космическая леталка-стрелялка-убивалка) мультиплеер. В теории вопросов больших у меня не возникало, все типично и достаточно легко. И в принципе все было хорошо, но когда дело дошло до сетевой синхронизации позиции игроков в виртуальном пространстве и тут я получил занозу в пятую точку.
Для реализации этой задачи я использовал стандартные подходы для синхронизации, отправлял по 10 пакетов в секунду и интерполировал позицию клиентов между полученными координатами, правда за чуть большее время (~110ms), дабы избежать подергиваний при сильных скачках пинга, но в итоге получал дополнительную задержку в добавок к пингу. И все работает в принципе сносно, кораблики ползают, крутятся, но... как только стоит разогнать кораблик до приличных скоростей, так сразу появляются проблемы, корабль начинает сильно колбасить, и чем больше скорость, тем сильнее кобласит. Пробовал увеличивать время интерполяции, кораблик в принципе себя начинал вести спокойнее, но разсинхронизация получается огромная, если двигаться за кем-то, то погрешность в реальном расположении получается порядка 5-7 корпусов корабля.
Ребят, я честно не знаю, возможно это нормально, хотя для каких-нить гонок, я думаю такие проблемы будут критичны.
Подскажите пожалуйста, как правильно будет решить проблему сетевой синхронизации для очень быстро движущихся игроков (гонки, авиасимуляторы)?
Я думаю, все расчеты должны производиться на сервере и он должен сообщать клиентам положение их и соседних кораблей(в области видимости).
Например: сервер, клиент1, клиент2
начальное положение: клиент1 - 0 ед., клиент2 - 10
На сервере проходит тик(итерация), допустим корабли перемещаются на 2 ед.
Сервер делает рассылку(броадкаст) по эвенту либо по пинг-запросу
клиент1 получает: позиция клиент1 - 2 ед., позиция клиент2 - 12 ед.
клиент2 получает: позиция клиент1 - 2 ед., позиция клиент2 - 12 ед.
Как только клиенты получают эту информацию, они её отображают(перемещают модели и т.п.).
Таким образом сервер всегда знает точные положения кораблей, исключена возможность считерить и послать серверу информацию о ненастоящем местоположении.
(Справедливости ради скажу, что к геймдеву не имею никакого отношения)
поддерживаю, тут нужно всё расчёты таректории скидывать на сервер, иначе один из игроков нажмёт на кнопку и начнёт двигать корабль в сторону, а из-за скачка пинга сервер вовремя не отошлёт данные другому игроку. А в какой-то момент придут данные, из-за такого пинга, что игроки находятся, допустим, в одной точке, что будет? По этому сервер должен присылать клиенту его положение, а что бы разгрузить сервер, то отсылать данные, только когда клиент что-то делает, если нечего не нажимает, то использовать последние данные как текущие в данные момент