Миллионы игроков по всему миру каждый день проводят долгие часы, играя в онлайн-игры, где мы можем соревноваться с людьми со всего мира в режиме реального времени. Этот вид развлечения просто работает, поэтому многие из нас не задаются вопросом, что происходит «под капотом». Какие процессы должны произойти, чтобы сбить с ног цифровую аватарку игрока, сидящего перед компьютером за сотни километров от нас. Мы решили поговорить с создателем онлайн-игры https://thebattle.club/ru, популярной в сети, о том, как работают онлайн-игры.
Как работают онлайн-игры и что с ними может пойти не так
Интересно, как выглядит информационный поток в онлайн-игре. Предположим, игрок бьет другого игрока по голове. Какие данные необходимо отправить и получить, чтобы эффект выглядел так, как ожидалось?
Я опишу пример потока данных на основе нашего примера, т.е. взаимодействия клиент-сервер. Чтобы подчеркнуть, клиент — это игрок, а сервер — это центральный блок, который собирает информацию от всех игроков и распространяет информацию между ними.
Движение игрока
- Каждый игрок отправляет на сервер данные о своей текущей позиции и ротации.
- Сервер получает данные и затем обновляет их в памяти.
а) В нашем случае мы дополнительно анализируем здесь, не пытается ли игрок сжульничать, телепортируясь в другое место. При этом проверяем, чтобы позиция игрока между обновлениями данных не изменилась слишком сильно и чтобы у него хватило выносливости, чтобы преодолеть дистанцию на такой скорости.
- Сервер отправляет обратно каждому игроку положение и поворот всех персонажей в поле зрения этого игрока.
- За счет математических функций интерполяции и экстраполяции устранен эффект скачков символов между позициями, полученными в последующих обновлениях. Другими словами, игрок испытывает более плавное движение аватара.
Стрельба на примере лука:
- Игрок сообщает серверу, что он произвел выстрел, отправив сгенерированный идентификатор, позицию, вращение пули и силу натяжения (от того, как долго мы натягивали нить, зависит, с какой силой полетит стрела).
- Сервер сохраняет данные пули и время ее выстрела. В каждом случае выстрел анализируется:
а) Мог ли быть произведен выстрел? Стрела должна быть достаточно близко к игроку, а не только рядом с головой противника.
б) У игрока должны быть боеприпасы.
- Сервер сохраняет уменьшенное количество стрел и затем сообщает игроку об изменении количества пуль в инвентаре.
Частота обновлений зависит от типа игры и количества игроков. В нашем случае последующие обновления ротации и положения отправляются с сервера игрокам каждые 100 мс. В игре, ориентированной на стрельбу из пушек, мы, вероятно, уменьшили бы это время до 50 мс, тогда как в такой игре, как World of Warcraft, где положение самого игрока не критично, 150-200 мс, вероятно, не изменили бы игровой процесс.
Обратите внимание, что эти обновления основаны на постоянно меняющихся данных, таких как позиция или ротация игрока. Все разовые действия, такие как стрельба, сбор чего-либо или использование умений, синхронизируются без задержек.
Состояние мира у всех игроков должно быть одинаковым, поэтому все вышеперечисленные элементы синхронизированы. В случае больших карт и часто меняющегося состояния объектов можно попробовать их кластеризовать и обновлять игрока только элементами из кластеров, находящихся в пределах его досягаемости. Однако в этом случае, когда новый кластер (который не был синхронизирован) входит в его область действия, он должен быть инициализирован текущим состоянием с сервера.