Как оптимизировать пинг в мультилпеере?
=========================================

 Я примерно знаю, как сделать мультиплеер, но не нашёл ответа на вопрос с пингом. Если у одного игрока пинг меньше, то этот игрок получит ответ от сервера быстрее, чем тот, у которого пинг больше. Значит игра обновится раньше у перового игрока, чем у второго.  

  

Сервер отправляет всем игрокам состояние игры, но все игроки получают ответы от сервера в разное время из-за пинга.  

  

Как это оптимизировать? 

 Можно забить на эту проблему и попытаться решить её оптимальным расположением серверов для целевой аудитории (так делают, например, дота 2, вов)  

Можно попытаться параллельно воспроизводить игровой процесс как на сервере, так и на клиенте, и синхронизировать (так делает, например, псо2, варфрейм) 

 Это очень сложная проблема, которую не решить в двух словах раз и навсегда. Поэтому ответ будет зависеть от особенностей игры. В общем случае - **никак**. Нет универсального рецепта.  

  

Например, если это пошаговая игра, то пинг вообще не критичен и можно блокировать действия всех игроков, пока все не получат обновлённое состояние игры.  

  

А если это шутер, то "блокировать" игру - не вариант, игроку необходимо оставить возможность двигаться своим персонажем и совершать действия, а серверу - задним числом засчитывать какие-то действия или отменять слишком смелые/резкие действия (откатывать к более "честному" состоянию). Ещё можно идти на компромиссы всякие, когда у разных игроков отображается чуточку разное состояние, но плюс-минус по сути одно и то же (по смыслу), а 1 шаг влево-вправо не считается.  

  

В "стратегиях" (т.е. в играх, где есть карта и много объектов с физикой или юнитов с ИИ), чтобы не пересылать всю информацию о том, что происходит в мире, есть такой подход, чтобы пересылать только команды игроков, а каждый у себя (на клиентской стороне) "симулирует" игру, так что она одинаковая у всех игроков. При таком подходе даже мелкие различия приведут к проблеме рассинхронизации игровой сессии с необходимостью послать сейв заново.  

  

В общем, так или иначе это какие-то уступки, допущения, округления, предположения (предсказания траектории движения объекта), ограничения и т.д.  

  

Кстати, пинг - это ещё пол беды. Если бы все пакеты приходили гарантированно хотя бы в окне 300 мс, это была бы сказка. К сожалению, пакеты ещё могут теряться совсем. И это тоже нужно как-то *оптимизировать*, чтобы игра не лагала и не подвисала. Опять-таки, способ зависит от игры, и хуже всего приходится играм от первого лица.