Проблемы регистрации попаданий в Hunt: Showdown в последнее время вызывают особое внимание и поэтому разработчики игры решили раскрыть свои карты, рассказав нам как это работает, на каком этапе решения они находятся сейчас и что планируют делать в будущем.

Система проверки в Hunt: Showdown: что она делает и зачем нам нужна

Поскольку этот пост будет довольно техническим, начнем с обзора сетевой модели Hunt: Showdown. Если вы уже знакомы с основами, просто перейдите к следующему разделу.

Сетевая модель Hunt: Showdown, как и во многих играх, построена на концепции выделенного сервера. Когда вы начинаете игру, вы подключаетесь к выделенному серверу Hunt: Showdown. Этот сервер работает на компьютере в центре обработки данных рядом с вами (надеюсь) и использует специальную версию игры. Эта версия работает по той же логике, что и на вашем компьютере, пропуская данные, которые ей не нужны для выполнения своей работы.

Выделенный сервер важен, потому что он в основном отвечает за игровой мир. Он имеет власть над позициями игроков, физикой и другими связанными аспектами игры.

Версия Hunt: Showdown, работающая на вашем компьютере, называется клиентской. Выделенный сервер отправляет вашему клиенту копию игрового мира. Эта копия регулярно обновляется через сеть. Тем временем клиент принимает данные от вас и отправляет данные выделенному серверу в зависимости от того, что вы делаете в игре.

Хотя интернет быстрый, он не мгновенный, поэтому, когда ваш клиент отправляет серверу сообщение, докладывающее, что вы только что нажали спусковой крючок на Caldwell, это сообщение также не мгновенное. Всегда имеется задержка в передаче данных. Эта задержка обычно называется сетевой задержкой и измеряется в миллисекундах (1 секунда = 1000 миллисекунд = 1000 мс).

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

Эта задержка, вызванная инфраструктурой интернет-провайдера, расстоянием, качеством аппаратного соединения и другими факторами, — проблема, которую не может решить ни одна игра. Это то, что все команды разработчиков игр должны учитывать, и у всех есть свои стратегии по минимизации ее воздействия. Hunt: Showdown в этом деле ничем не отличается.

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

  1. Поскольку сетевая задержка неустранима, то вы никогда не видите текущее состояние игрового мира. Если передача сообщения от сервера длится 40 миллисекунд, то вы видите мир таким, каким он был 40 миллисекунд назад.
  2. Когда вы движетесь или стреляете из оружия, ваше клиентское приложение отправляет об этом сообщение на сервер, затем сервер обрабатывает его и, в зависимости от содержимого вашего сообщения, отправляет вам ответное до того, как вы увидите результат вашего действия. Суммировав эти задержки с обеих сторон, мы получим задержку в 80 миллисекунд.

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

Чтобы сохранить отзывчивость игры, мы используем систему прогнозирования на стороне клиента. Эта система позволяет вам действовать в локальном игровом клиенте и сразу же видеть результаты, делая прогноз того, что произойдет. Когда приходит ответ от сервера, система проверяет, соответствует ли то, что вы сделали локально, тому, что произошло на сервере. Если он не совпадает, система сверяет ваш локальный клиент с версией событий на сервере.

Эта система создает интересную проблему — вам разрешают двигаться и действовать мгновенно, видя «прошлое» представление игрового мира. Тем не менее, ваш персонаж действует в «будущем», поскольку сервер пока еще не получил эту информацию и не интегрировал ваш ответ в общую картину мира.

В этот момент вы, вероятно, задаетесь вопросом, какое отношение это имеет к стрельбе по охотникам…

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

Текущее состояние системы регистрации попаданий в Hunt: Showdown

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

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

Из-за задержек в сети ни один клиент никогда не согласится с состоянием мира, равно как и сервер. Вот почему у нас есть система проверки попадания. Эта система, работающая на выделенном сервере, выступает в качестве рефери, когда клиент стреляет в цель. Система проверки попадания всегда должна выбрать чью-то сторону при принятии решения. Наша система, как и во многих других играх, использует подход «Favor the Shooter» (в пользу стрелка).

Таким образом, если клиентское приложение заявляет, что был совершен выстрел, система проверки попаданий запустит несколько стратегий проверки, чтобы подтвердить то, что заявил клиент. Если это считается законным, выстрел будет считаться попаданием.

Стратегии валидации включают в себя просмотр прошлой истории состояния мира (сопоставление с задержкой, с которой этот клиент видит мир) и выяснение того, мог ли выстрел — с этой позиции клиента, в этой точке на карте, с этим направлением прицеливания, с использованием этого оружия и с этими боеприпасами, быть способным поразить цель, в соответствии с записями, которые сервер имел по каждому игроку, участвующему в борьбе за урон.

В некотором смысле это означает, что мы позволяем вам немного переписать историю состояний серверов, если заявка вашего клиента считается действительной. Чем больше ваша задержка к серверу, тем больше времени может уйти в прошлое, хотя у нас действительно установлен жесткий предел в 800 миллисекунд

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

Вы можете подумать, что это ужасно. Но рассмотрим альтернативы:

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

Как видите, проблемы с задержкой в ​​сети — весьма сложные задачи, с которыми приходится сталкиваться. Но это еще не все…

Задержка редко бывает стабильной. Одно сообщение может доставляться на сервер 20 мс, в то время как следующее может быть доставлено за 25 мс, а следующее — за 10 мс. Сообщения также могут быть потеряны при передаче, что означает, что они должны быть отправлены повторно, вызывая еще большую задержку. Эта неопределенность означает, что вы никогда не сможете точно знать, насколько далеко впереди/позади клиенты и сервер во времени, что может привести к рассинхронизации.

Представьте, что последним сообщение, которое вы отправили на сервер, было то, что вы нажимали клавишу W (движение вперед). Сервер симулирует вашего персонажа, движущегося вперед. Затем вы отпускаете W, останавливаясь. Но из-за различий в задержке сообщение об остановке доставляется дольше. Если это произойдет, сервер подумает, что вы нажимали W дольше, чем на самом деле, а это означает, что ваша конечная позиция на сервере будет отличаться от вашей на клиенте. Эта ситуация называется рассинхронизацией (de-sync).Текущее состояние системы регистрации попаданий в Hunt: Showdown

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

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

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

TL;DR

Hunt: Showdown позволяет клиентам предикативно взаимодействовать с собственным представлением о состоянии сервера и использует систему проверки попаданий для проверки правильности выстрелов и атак ближнего боя. В этой системе используется подход «в пользу стрелка», означающий, что выстрел считается действительным до тех пор, пока он считается законным в соответствии с историей игрового состояния сервера, хотя этот процесс усложняется природой задержки и наличием рассинхронизации между клиентом и сервером.

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

Что здесь не так?

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

Смотрите POV breakdown от MrSpwn на www.twitch.tv

Итак. На 2:00 ролика MrSpwn описывает ситуацию, когда делает выстрел, который вы видите на экране, но он не показан на экране другого игрока. Скорее всего, это было вызвано механизмом системы проверки попадания, известным как проверка совершения выстрела. Этот шаг гарантирует, что выстрел игрока был сделан с правильной позиции, то есть соответствует истории событий на сервере. Если бы он был рассинхронизирован, но еще не согласован, то в этот момент его выстрел мог не пройти тест на минимальные уровни допуска на совершение выстрела.

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

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

Другая проблема, которую MrSpwn описывает в своем видео, и ту, которую вы также можете наблюдать в этих двух клипах, является более типичной проблемой, которая проистекает из природы подхода «в пользу стрелка».

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

Что разработчики делают для исправления этого

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

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

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

Текущее состояние системы регистрации попаданий в Hunt: Showdown

Это еще не все, на что обращают внимание разработчики для решения этой проблемы. Ваши отзывы очень важны для них, особенно в форме видеоклипов, подобных тем, что показаны выше. Команда Crytek продолжит собирать данные от сообщества и со своих серверов, чтобы усовершенствовать систему проверки попаданий.

Поделись с друзьями!