В современном мире игровая индустрия занимает особое место в сфере разработки программного обеспечения (ПО) для персональных компьютеров. Молодое поколение все чаще отдает приоритет препровождению свободного времени, играя в компьютерные игры, соревнуясь друг с другом и устанавливая личные рекорды. Данная тенденция породила популярность онлайн-игр.
Рассмотрим подход создания онлайн-игр, который подразумевает использование авторитарного игрового сервера [2]. Сервера подобного типа имеют достаточную мощность, а также стабильное соединение и высокую пропускную способность, что позволяет свести к минимуму задержку между игроками и сервером.
Рис. 1. Авторитарная архитектура серверов
Авторитарный сервер получает данные от клиентов, проверяет и использует их для вычисления нового состояния игрового мира, после чего отправляет результаты вычислений всем игрокам [1]. В данном подходе вероятность появления нечестных игроков практически сведена к нулю, ведь любые подозрительные действия, совершающиеся игроками, будут блокированы со стороны сервера.
Простая реализация описанной выше архитектуры общения клиентов и сервера приводит к задержке между пользовательскими командами и изменениями, которые происходят на экранах игроков. Например, игрок нажимает на кнопку передвижения персонажа вправо, однако герой испытывает небольшую задержку перед тем, как начинает двигаться. Причиной возникновения данной задержки является необходимость клиента в отправке данных о своем вводе на сервер. После получения новой информации сервер начинает её обработку и рассчитывает новое состояние игрового мира. Как только расчеты произведены, сервер должен отправить результат обратно клиенту. Подобные ситуации делают игру недостаточно отзывчивой для игрока, а в худшем случае — непригодной к прохождению. В мире игровой индустрии и проектировки многопользовательских онлайн-игр разработчики создали универсальный алгоритм клиентских предсказаний, который помогает сделать игру максимально отзывчивой.
Большинство времени игровой сервер обрабатывает достоверные запросы. Это означает, что большинство входных данных о вводе с игровых устройств клиентов, скорее всего, будут истинными, и обновление состояния игрового мира завершится максимально предсказуемо. Из этого предположения следует то, что клиент может предсказать новое состояние игрового мира самостоятельно, не дожидаясь ответа от сервера, причем, в большинстве случаев его предсказания окажутся правильными. Таким образом, вместо того, чтобы просто отправлять данные о вводе и ожидать, пока новое состояние игрового мира начнет отображаться на экране, клиент может отправить ввод и незамедлительно начать рендеринг результатов этого ввода, основываясь на собственных расчетах. При такой реализации обмена данных между клиентом и сервером получается избежать задержки между вводом и отображением результатов этого ввода, и игра будет казаться для игрока наиболее отзывчивой.
Рис. 2. Использование алгоритма клиентских предсказаний
Для большинства онлайн-игр использование алгоритма клиентских предсказаний является достаточным для комфортной игры. Однако, для специфичного жанра «онлайн-шутер», главной игровой механикой которого является стрельба игроков друг в друга, свойственна проблема задержки между выстрелом на клиентской стороне и обработкой этого выстрела на авторитарном сервере. Устранения данной проблемы возможно с помощью алгоритма компенсации задержки, который в игровой индустрии называется «лаг-компенсация».
Рассмотрим подход к реализации алгоритма компенсации задержки «Favor the shooter» (англ. «Благоприятствовать стрелку»). Под этим подходом подразумевается следующее: если игрок увидел какую-либо цель на своём экране, направил на неё прицел и произвел выстрел, который игровой клиент зарегистрировал, как «попадание», в этом случае данный выстрел с вероятностью 90 % должен быть засчитан и на серверной стороне. В корне данной техники лежит алгоритм компенсации задержки, который позволяет серверу проверять информацию о выстрелах, переданную игроком.
Представим игровую ситуацию, в которой два игрока находятся на определенных позициях. Один из игроков совершает выстрел по своему сопернику. Предположим, что стрелок находится на позиции (10, 10), а цель расположена напротив него и имеет позицию (15, 15). Игрок совершает выстрел, результатом которого является луч, построенный от точки игрового мира (10, 10) к точке, где расположена цель (15, 15). Алгоритм клиентских предсказаний, который рассматривался ранее, с уверенностью может сказать, что цель поражена и отображает в качестве результата анимацию попадания снаряда по сопернику. Параллельно с выстрелом на авторитарный сервер клиент отправляет информацию о том, откуда этот выстрел был произведён. Сервер симулирует процесс этого выстрела, зная позицию стрелка и цели, и отправляет результат (в данном примере попадание по цели) не только клиенту, который совершил выстрел, но также и игроку, по которому этот выстрел совершался. Стрелок, получая ответ от сервера, лишь подтверждает собственное клиентское предсказание, а цель в это же время получает урон на 10 единиц здоровья. В данном примере выстрел завершился удачно, и задержка в соединении между игроками и сервером никак не повлияла на его результаты.
Рис. 3. Схема симуляции выстрела
Усложним данный пример, добавив условие, что на момент выстрела оба игрока передвигаются в одном направлении. В данном случае задержка в соединении сыграет со стрелком злую шутку, в то время как для цели она окажется достойным «телохранителем». Предположим, что игроки передвигаются лишь вправо по оси X и постоянно отправляют серверу информацию о вводе со своих игровых устройств. Как и в предыдущем примере, стрелок совершает выстрел из позиции (10, 10) по цели, которая, по его мнению, в текущий момент времени имеет координаты (15, 15). Алгоритм клиентских предсказаний, в очередной раз, регистрирует точное попадание по движущейся цели, однако соперник не получает никакого урона. Данная проблема связана с тем, что игроки получают события с сервера, которые происходили в прошлом. Это значит, что в тот момент, когда игроку, совершавшему выстрел, пришла новая позиция своего соперника (15, 15), на сервере эта информация стала уже неактуальной. В то время, как данные о выстреле из позиции (10, 10) в точку (15,15) были доставлена на сервер, цель уже находилась в новой позиции (16, 15), поэтому симуляция выстрела завершилась неудачно. Проблема синхронизации подобного рода ещё больше усугубляется при высоких задержках в соединении между клиентами и сервером.
Ключом к исправлению данной проблемы является алгоритм компенсации задержки. Суть алгоритма заключается в том, чтобы предоставить серверу возможность запоминать позиции игроков, в которых они были в прошлом. Сохранение позиций базируется на задержке в соединении между клиентом и сервером: то есть, если задержка составляет 50 миллисекунд, тогда сервер запоминает все позиции игрока, в которых он находился 50 миллисекунд назад. Чем больше задержка в соединении между клиентом и сервером, тем дольше сервер хранит информацию о перемещениях этого клиента. Теперь, когда клиент совершает выстрел, он дополнительно отправляет свою позицию, с которой этот выстрел был совершен, чтобы информация о перемещении стрелка на сервере стала актуальной. Также стрелок отправляет информацию по какому игроку он сделал выстрел и завершился ли этот выстрел попаданием, основываясь на результатах клиентского предсказания. Сервер, получив данные о выстреле, находит игрока, который является целью и фактически отматывает время назад, проверяя, действительно ли находился этот игрок в точке, в которой по нему попал стрелок. Если информация о попадании подтверждается, сервер отправляет стрелку и цели, соответствующие сообщения с подтверждением попадания. В данном случае, можно считать, что задержка в соединении практически сведена к нулю, и игроки смогут попадать друг в друга, даже если они играют с разных концов света.
Рис. 4. Использование алгоритма компенсации задержки.
Таким образом, реализация алгоритма клиентских предсказаний позволяет устранить задержку между вводом с игровых устройств игроков и отображением результатов этого ввода. Использование алгоритма компенсации задержки в играх жанра «онлайн-шутер» позволяет игрокам получать максимальный игровой опыт в перестрелках, в независимости от того, насколько далеко от них расположен игровой сервер и какую задержку в соединении они испытывают.
Литература:
- «No Bugs» Hare. Development and Deployment of Multiplayer Online Games: from social games to MMOFPS, with sock exchanges in between. — Вена: ITHare.com, 2015. — 789 c.
- Джошуа Глейзер, Санджай Мадхав. Многопользователькие игры. Разработка сетевых приложений. — СПб.: Питер, 2017. — 368 с.