Проблемы регистрации попаданий в 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 заключается в том, чтобы улучшить систему проверки попаданий, чтобы она была достаточно снисходительна в отношении рассинхронизаций, чтобы она не делала недействительными законные выстрелы, но была достаточно строгой, чтобы препятствовать читерам.

Данная информация более не является актуальной, поскольку в обновлении 1.5.2 была ужесточена точность расчётов в лучшую сторону, а так же исправлено несколько проблем с данными телеметрии, о которых ниже.

Улучшение регистрации попаданий при смерти

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

Хитбоксы

Хитбоксы создаются дизайнерами и могут иметь различные формы. В Hunt: Showdown они состоят из нескольких форм, так же имеют различные множители получаемого урона и приоритеты попадания. При попадании одним выстрелом в несколько участков сразу, например голова, ноги и руки — приоритет будет отдан именно попаданию в голову и от её множителей будет нанесён максимальный урон. Другой пример: вы стреляете в охотника сбоку, пуля попадает ему в левую руку, проходит в туловище и после в правую руку то тогда урон будет нанесён хитбоксам туловища поскольку оно имеет приоритет выше, чем у рук. Соответственно если попасть только в руку то пуля не встретив других хитбоксов с повышенным приоритетом нанесёт урон только руке.

Хитбоксы охотника разбиты на несколько зон с различными приоритетами: голова, грудь, живот, руки и ноги. Чем меньше у зоны приоритет — тем меньше урона данная зона получит в случае её поражения.

Хитбоксы легендарных охотников ничем не отличаются от хитбоксов обычных охотников! Стреляя Чёрному пальто в шляпу или Горцу в медвежью голову вы не нанесёте им никакого урона!

Само собой, монстры имеют другие хитбоксы с приоритетами поэтому и урон по ним проходит другой.

 

 

 

 

 

 

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

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