Работа системы определения попаданий
Привет, я Кевин Ли, инженер-программист из команды игровых систем VALORANT. Наша команда отвечает за разработку многих ключевых систем, поддерживающих игровой процесс VALORANT, таких как движение, стрельба и ввод данных. Я расскажу вам об одной системе, которая является основополагающей в играх жанра шутер от первого лица: определении попаданий.
В такой игре как VALORANT определение попаданий является одной из самых важных систем, ведь разница между победой и поражением может заключаться всего в одном выстреле в голову. И мы как разработчики должны сделать так, чтобы результаты стрельбы игрока были понятны, правильно ощущались и – самое важное – точно рассчитывались.
Иногда мы видим публикации или получаем сообщения от игроков с видео, в которых определение попаданий выглядит неверным. Мы серьезно относимся к таким отзывам и просматриваем отдельные кадры каждого видео, чтобы определить, работает ли система, как ей подобает.
Стоит отметить, что, на наш взгляд, сейчас определение попаданий в VALORANT работает хорошо. Да, иногда бывают пограничные случаи, при которых происходят ошибки, и мы всегда серьезно относимся к таким вещам. Мы постоянно ищем способы улучшения качества и наглядности работы наших систем.
ТОЧНОСТЬ ОПРЕДЕЛЕНИЯ И НАГЛЯДНОСТЬ
В патче беты 0.50 мы заметили рост количества жалоб на проблемы с определением попаданий. После рассмотрения отчетов игроков, видео, а также внутреннего тестирования нам удалось выявить некоторые нераспространенные ошибки определения попаданий, но ни одна из них не могла быть причиной такого количества жалоб. При более внимательном изучении оказалось, что большинство видео были связаны не с ошибками точности определения попаданий, а с наглядностью. Выстрелы обрабатывались правильно, но игроку передавалась неверная зрительная информация о результате. И это указывает нам на важное различие между точностью определения и наглядностью.
И хотя оба этих аспекта важны для "восприятия" выстрела...
- Под точностью определения подразумевается то, является ли результат выстрела правильным (то есть в случае ошибки выстрел в голову может засчитаться как попадание в тело, или местоположение врага на стороне клиента будет отличаться от координат на стороне сервера).
- При проблемах с наглядностью сложно бывает понять результат попадания (к примеру, если пуля попала в плечо, но выглядело это так, будто она попала в голову).
- Ошибки точности определения гораздо хуже тех, что связаны с наглядностью.
Надеемся, что эта статья поможет вам лучше понять работу системы. Мы хотим, чтобы игроки смогли оценить свой игровой процесс и понять, что именно происходит на экране, когда дело касается их выстрелов. Я расскажу о том, как система работает на высоком уровне, а также объясню, что происходит с момента выстрела и до отображения попадания в голову.
О технической стороне вопроса можно узнать из нашей статьи о неткоде VALORANT в техноблоге Riot.
Мы также разберем несколько частых жалоб на "неверное определение попаданий", и я попытаюсь объяснить, что именно в них происходит и как мы стараемся улучшить разборчивость выстрелов в таких ситуациях.
ОТ НАЖАТИЯ КНОПКИ ДО ПОПАДАНИЯ В ГОЛОВУ
Прежде чем мы поговорим о том, что происходит после выстрела, важно понять, как игра симулирует происходящее. Игровой процесс VALORANT симулируется дважды: один раз на сервере (эта симуляция имеет приоритет) и один раз на стороне клиента (предсказывая результаты сервера для более отзывчивого процесса игры).
Симуляция игры подразумевает полное моделирование матча, включая позиции игроков, траектории полета умений, наличие дыма на поле боя. Каждый кадр игра фиксирует состояние симуляции и использует эти данные для отрисовки кадра на вашем экране. Сервер делает то же самое для всех кадров (пропуская этап визуализации, ведь со стороны сервера на них никто не смотрит).
Так вот, противник выходит из-за угла, и благодаря вашему отличному расположению прицела вы уже навелись на голову врага, поэтому вы нажимаете на левую кнопку мыши и стреляете... Что же происходит потом?
Как только вы нажимаете кнопку, ввод отправляется в систему обработки (при этом происходит небольшая задержка аппаратного/программного обеспечения). Каждый кадр игры система обрабатывает все вводы, полученные во время прошлого кадра. Когда вы стреляете, ввод "выстрела" отправляется на сервер вместе с временной отметкой того, на каком кадре симуляции выстрел произошел.
Важно отметить, что эта временная отметка зависит от того, что отображается на вашем экране в момент ввода, который получает VALORANT. Теперь мы должны следить за выстрелом в двух разных симуляциях: на стороне клиента и на стороне сервера.
Начнем с клиента на вашем компьютере. Сразу же после отправки данных выстрела на сервер клиент начинает работать над отображением дульной вспышки и следа траектории вашего выстрела. Это начнет происходить не раньше следующего кадра после ввода выстрела, ведь игре нужно отобразить новый кадр на вашем экране. Это важно, так как это означает, что кадр, в котором обрабатывается выстрел, НЕ ЯВЛЯЕТСЯ тем же кадром, в котором отображается его след – этот кадр является как минимум предыдущим.
Это иногда снижает наглядностью выстрела. Эту проблему с синхронизацией обычно решают задержкой пули. Мы так не делаем, ведь задержка пули приведет к увеличению задержки ввода, а мы хотели бы, чтобы она в VALORANT была как можно короче. Что же касается определения попаданий, клиент ждет отклика от сервера с результатом, прежде чем отображать подтверждение попадания. Для гарантии единого восприятия среди всех игроков и для предотвращения взломов клиентов читерами с целью подделки результата выстрелов результаты выстрелов определяются по данным сервера.
В это время сервер получает сообщение от клиента о том, что был совершен выстрел. Из-за задержки сети с момента выстрела уже прошло некоторое время. Чтобы гарантировать, что выстрел был произведен в той же симуляции, что была показана игроку, сервер перематывает симуляцию назад к временной отметке клиента перед оценкой определения попадания. Это включает в себя перемотку позиций игроков и состояния их анимации. Затем он отправляет результаты выстрела обратно клиенту. Например, представим, что вы попали в голову!
Клиент получит сообщение от сервера с результатами выстрела и затем запустит подходящий эффект и звук попадания. В нашем случае будет запущен эффект и звук попадания в голову. Так как клиент должен ждать результатов выстрела от сервера, происходит задержка между следом от пули и эффектами попадания, которая равна продолжительности прохождения полного маршрута сигналом вашего подключения (то есть при 40 мс задержки до сервера происходит 80 мс задержки между следом и эффектом попадания), к этому также добавляется немного времени на обработку. При высокой задержке эта разница становится более заметна.
Мы продолжаем работу над улучшениями в этой сфере с точки зрения наглядности.
РАЗБОР ПРИМЕРА №1: попадание по движущимся целям
Во многих жалобах на определение попаданий можно увидеть, что цель бежала. Давайте же рассмотрим внимательнее то, что происходит на экране, когда выстрел попадает по цели в движении. Мы видим, что игроку удалость попасть в голову бегущего врага. Для простоты демонстрации скажем, что клиент работал на 60 кадрах в секунду. Вы можете увидеть, что в кадре перед появлением следа от выстрела прицел игрока наведен на голову противника.
Однако в кадре появления следа это уже не так.
Второй клип показывает такую же ситуацию, но выстрел пролетает совсем рядом с целью. Если просмотреть отдельные кадры в видео, то можно увидеть, что верно обратное: прицел игрока не находится на голове врага в кадре перед появлением следа, но перемещается на нее в следующем кадре вместе со следом. Сначала вы, наверное, захотите указать на кадр со следом и сказать: "Смотрите, ну это же точно выстрел в голову!" Когда мы проверяем видео и повторы, нам следует следить за кадром перед появлением следа для точного понимания того, когда был совершен выстрел.
Давайте вернемся к тому примеру, в котором произошло попадание, и рассмотрим тот кадр, где обрабатывается графический эффект попадания. Есть существенная разница между текущим расположением игрока и тем местом, в котором появляется эффект попадания, что связано с задержкой соединения. Это может ввести вас в замешательство при оценке выстрела, ведь вы наверняка отслеживаете текущее положение противника, а не его положение во время выстрела. Это также может привести к еще большей неразберихе в тех случаях, когда враг приседает или выбегает боком (что мы рассмотрим в разборе №2).
Этот пример демонстрирует недостаток разборчивости в текущей системе определения попаданий. В идеальной ситуации вам не нужно было бы изучать всю эту информацию для понимания ситуации. Мы как разработчики осознаем это и ищем пути повышения наглядности в таких случаях.
РАЗБОР ПРИМЕРА №2: приседание и эффект попадания
Итак, вы начали перестрелку на большой дистанции. К вашему будущему сожалению, вы зажали левую кнопку мыши и выстрелили очередью. Хоть одна из этих пуль обязательно попадет в голову, ведь так? Но нет, ваш Vandal попадает 3 раза в тело, наносит 117 урона, а затем вы получаете в ответ выстрел в голову.
В гневе вы открываете свою запись игры, уверенные, что все дело в определении попаданий. Вы видите, что противник приседал, пытаясь увернуться от вашего огня. К вашему удивлению, вы видите эффект попадания прямо на уровне головы врага в тот момент, когда тот приседает. Но ваша боевая сводка показала только попадания в тело!Как так получается?
Вот ссылка на существующую публикацию на reddit с заголовком "Выстрелы в голову не засчитываются при приседании игрока".
Когда наша команда изучает жалобы на неточное определение попаданий, чаще всего мы сталкиваемся именно с такими ситуациями. Но на самом деле определение попаданий работает правильно – когда вы нажимаете на кнопку выстрела, пули летят по направлению вашего прицела (не учитывая разброс и снижение точности при перемещении), и эти выстрелы точно отмечаются сервером.
Но стоит учитывать несколько разных факторов, из-за которых зрительное восприятие может казаться неверным:
- Эффекты попадания задерживаются в связи с задержкой подключения к сети.
- Эффекты попадания отображаются в месте изначального попадания.
- Игрок, по которому вы стреляете, движется (довольно часто он приседает).
В качестве другого примера предположим, что у игрока пинг 50 мс. Игрок попадает в плечо противника. Так как нам нужно дождаться подтверждения попадания от сервера, эффект попадания на теле будет воспроизведен через 100 мс после этого. Но за эти 100 мс противник начал приседать, двигая свою голову прямо за появляющийся эффект попадания. На большом расстоянии и в пылу перестрелки эффект попадания в тело можно принять за эффект попадания в голову.
Больше всего проблем с этим было во время патча беты 0.50, когда эффекты кровотечения были случайно отключены для всех игроков, а наши эффекты искр от попадания в голову и в тело несколько похожи. Данные эффекты всегда отличались, но мы поняли, что это не всегда заметно во время боя.
Это недочет наглядности определения попаданий, и мы усердно работаем над его решением. Одним из возможных вариантов может стать привязка эффекта попадания к определенной части тела персонажа, чтобы между ними всегда была четкая связь – даже при сильной задержке.
Вот сравнение нашего эффекта попадания в голову без крови с таким же эффектом попадания в тело:
ЗАПЛАНИРОВАННЫЕ УЛУЧШЕНИЯ НАГЛЯДНОСТИ
В обоих примерах рассмотрены случаи, в которых текущих эффектов попаданий недостаточно. Одним из подготавливаемых нами изменений будет ввод эффектов крови и искр, отображающихся на текущем положении персонажей в соответствии с тем, в какую часть тела им попали, и они будут следовать за целью в движении. Это должно серьезно повысить разборчивость в ситуациях вроде примера №2 с приседающим врагом, так как зрительный эффект будет следовать за движением тела.
Одним из минусов такой системы может быть перемещение эффекта вместе с персонажем за укрытие. Представьте, что игрок с пингом в 100 мс стреляет по врагу, который быстро выглядывает из-за угла и прячется. Если он попадет по врагу, но противник сразу переместится в укрытие до подтверждения попадания от сервера, то стреляющий может не увидеть эффект.
Мы также думали устранить эту проблему за счет нескольких эффектов частиц, часть которых могла бы следовать за игроком, в то время как другие появлялись бы на месте попадания в зависимости от симуляции клиента. Но это может вызвать замешательство в тех случаях, когда симуляции клиента и сервера не могут прийти к единому решению по результату выстрела: эффекты должны понятно передавать представляемые ими события, чтобы с их помощью было легко понять результат выстрела.
Мы продолжаем работать над этой проблемой и улучшениями наглядности и надеемся внести изменения в ближайшем патче.
ПРОДОЛЖАЙТЕ ДЕЛИТЬСЯ С НАМИ ВИДЕО
Мы надеемся, что эта статья помогла вам лучше понять принципы работы определения попаданий в VALORANT, а также узнать, как рассчитываются результаты выстрелов. Продолжайте присылать нам видео тех случаев, когда вам кажется, что определение попаданий работает некорректно, а мы постараемся их все как следует изучить.
Даже если в видео не будет ошибок, они помогают нам быстрее выявлять проблемы с точностью определения попаданий в тех случаях, когда они происходят на самом деле (мое сердце бьется сильнее каждый раз, когда я вижу сообщение на reddit со словами "определение попаданий" в заголовке).
По этой ссылке вы сможете увидеть пример ошибки в определении попадания на reddit.