likerRr
@likerRr
front-end developer

Как спроектировать авторитетный игровой сервер?

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

  1. Какими способами можно обеспечить одинаковый (хотя бы приблизительно) пинг для всех клиентов?
  2. Как сервер должен обрабатывать стрельбу одного корабля в другого? Конкретно интересует, должен ли сервер в момент выстрела игрока А уже знать о том, убит ли игрок Б и послать ему соответственное сообщение, чтобы отрисовать уменьшение здоровья? Или он (сервер) должен узнать об этом лишь тогда, когда игрок Б отправит событие "по мне попали" и затем проверить, был ли произведен по нему выстрел и послать на клиент (игроку Б) результат "пальбы"?
  3. Как организовать синхронизацию действий ИИ между клиентами? Кто (сервер или один из клиентов или кто-то еще) должен регулировать действия ИИ и оповещать об этом остальных клиентов?
  4. Как проектируют моментальную синхронизацию и обработку действий между клиентами? Например в MOBA играх все происходит довольно быстро и порой бывает так, что необходимо синхронизировать какое-то действие, которое происходит за пол секунды, а то и меньше (например кто-то подпрыгнул, а его заморозили). Какие протоколы передачи данных используют в данном случае и какой порядок действий должен быть в общении между клиентами и сервером?

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

Может, среди пользователей есть терпеливые люди, кто готов помочь с объяснениями за рамками тостера? Оставляйте контакы, если есть возможность пообщаться.

Спасибо!
  • Вопрос задан
  • 666 просмотров
Решения вопроса 1
saboteur_kiev
@saboteur_kiev Куратор тега Разработка игр
software engineer
1. Никак. Но у многих игр есть определенный критичный пинг, выше которого играть некомфортно.
Выход - изначально проектировать игровую механику таким образом, чтобы популярный пинг (до 10-20 мс) был более-менее комфортен.
2. У вас немного каша даже в том смысле, как вы описываете игру. Это шутер, это реал-тайм стратегия, это симулятор? У каждого свои фичи, но даже 50 мс вполне достаточно, чтобы более-менее адекватно успевать отрисовку. В большинстве случаев клиент некритичные вещи отрисовывает сразу по действию, а получая ответ-подтверждение от сервера уже доделывает более критичные (например уменьшить жизнь можно сразу, а уничтожить корабль можно только после подтверждения от сервера).
3. Конечно сервер должен регулировать действия. Все критичные вещи должны быть вычислены на сервере. Клиент может делать предупреждающие вычисления, которые дублируют то, что делает сервер, но только в плане отрисовки. Для этого алгоритм должен совпадать. Но подтверждение с сервера обязательно. Иначе такую игру взломать поддельными пакетами будет доступно любому школьнику.
4. В МОБА играх всего 10 игроков. Между моментальной и быстрой синхронизацией уйма времени.
Например игроку из России комфортно играть на русском и европейском сервере. А на американском пинг свыше 20-30 уже ВЕСЬМА заметен.

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

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

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