gzhegow
@gzhegow
aka "ОбнимиБизнесмена"

Как пишут обмен данными (сетевой движок) для компьютерных игр?

Игра, где персонажи могут ходить. Неужели в сокет передается буквально "клиент 1 нажал и держит кнопку вправо", "клиент 1 отпустил кнопку вправо", а потом сервер как-то проигрывает одно и то же у себя в фоне, и отсылает эту же информацию на машину каждого клиента, чтобы ещё там проиграть? Как передавать меньше данных, не рискуя рассинхроном? Какие рассинхроны не критичны? В каком порядке происходит проигрывание на сервере того, что на клиенте было сделано, и как клиенты-друзья воспроизводят действия?
  • Вопрос задан
  • 816 просмотров
Решения вопроса 2
twobomb
@twobomb
Какие известны хитрости, чтобы передавать меньше данных, не рискуя рассинхроном?

Чем меньше тик рейт сервера, тем меньше данных. Одно дело динамичный шутер(батла на 130 человек), а другое дело кооп игра на 4 человек. В одних случая критичен высокий тик рейт в других нет. Хотя... умереть в батле через секунду после того как ты забежал за стену благое дело...
Какие рассинхроны не критичны?

Опять зависит от игры.
В каком порядке происходит проигрывание на сервере того, что на клиенте было сделано, и как клиенты-друзья воспроизводят действия?

Ну почитайте какие нибудь статьи вот например на хабре
Мультиплеер в быстрых играх (части I, II)
Мультиплеер в быстрых играх (Часть III: появление ...
Мультиплеер в быстрых играх (Часть IV: Хэдшот! Пут...

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

Сервер принимает сообщения от игроков. Некоторые тут же форвардит остальным подключённым к нему. Некоторые вызывают серверное событие, и уже оно рассылает всем какое-то сообщение.

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

С зажатой клавишей, наверное, достаточно события нажатия, и события снятия. Вычисление позиции на карте при таком управлении не тяжёлая вычислительная задача – можно параллельно считать на сервере, наверное. Раз в пару секунд синхронизируя координаты между сервером и игроком.

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

Можно добавить предиктивность: если игрок сейчас бежит прямо и прямо нет стены, то с бОльшей вероятностью в следующие пол-секунды он продолжит бежать.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
1) Можно передавать нажатие/отжатие клавиш/мыши серверу, а он меняет положение игрока и всем рассылает его новые позиции (как в world of tanks)
В то время, пока сервер считает, клиент может предсказать и сам у себя визуально переместить, а затем поправить положение с пришедшим от сервера положением.
+ все расчёты делает сервер => многие читы не работают (aim, teleport)
- высокий пинг

2) Можно передавать свою позицию серверу, а тот рассылает её другим клиентам (как в cs)
+ низкий пинг
- читеры могут фейковые данные посылать (aim, teleport)

3) Можно напрямую передавать всем клиентам (peer to peer)
- высокая нагрузка на сеть (т.к. все постоянно друг-другу шлют данные)
- простор для читеров
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы