Меню
StopGame  Блоги Блог Podokonnik Netcode в шутерах. Почему ты промахиваешься?

Самое актуальное

  • Превью (ИгроМир 2018) к игре The Dark Pictures: Man of Medan
  • Превью (ИгроМир 2018) к игре Darksiders III
  • Видеообзор игры Space Hulk: Tactics
  • Видеообзор игры My Memory of Us
  • Обзор игры My Memory of Us
  • «Инфакт» от 19.10.2018 — Кампания Battlefield V, Diablo 4 и BlizzCon 2018, трейлеры Red Dead Redemption 2 и SoulCalibur VI…
  • Пользовательский обзор недели
  • Превью (ИгроМир 2018) к игре Stygian: Reign of the Old Ones
  • Видеообзор игры Fist of the North Star: Lost Paradise
  • Как пройти «Тень Чернобыля» за 10 минут [Спидран в деталях]
  • Destiny 2: Отвергнутые. Заключительная охота
  • SYNTHETIK. Имя им — Легион!
  • Превью (ИгроМир 2018) к игре Metro: Exodus
  • Рефанд?! — Gun Rage, Westboro, Mana Spark, Awesome Pea, Space Raiders RPG…
  • Зачем FIFA 19?
  • Обзор игры Super Mario Party
  • Обзор игры Niffelheim
  • Превью (ИгроМир 2018) к игре Hitman 2
  • Поиграли в Fallout 76. Война изменилась
  • Превью (ИгроМир 2018) к игре Twin Mirror
  • Assassin's Creed: Odyssey. Пинок веры
  • 48 ЧАСОВ ЛУЧШИХ СТРИМОВ, часть 1
  • FIFA 19 — Команда Стопгейм
  • Обзор игры Wandersong
  • Обзор игры Deep Sky Derelicts
  • Space Hulk: Tactics. Терминатор во чреве кита
  • Пользовательский обзор недели
  • Игромир 2018. День 3 — самый эффектный косплей!
  • Destiny 2: Отвергнутые. Ещё одна битва
  • Игромир 2018. День 2 — самые актуальные игры!

Netcode в шутерах. Почему ты промахиваешься?

+70

Основы



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

Я попал?


В Quakeworld (Сетевой код игры Quake(1996)), например, игроку приходилось стрелять на опережение, чтобы самостоятельно скомпенсировать задержку на стрельбе. Смотрите – если у стрелка возникает 100 миллисекундный лаг и он хочет выстрелить в другого игрока, движущегося со скоростью 100 условных единиц в секунду, игрок должен целиться в точку на земле за десять условных единиц до бегущего, для того, чтобы попасть в него. Раздражает.

Если же вы играете в современный шутер – это больше не проблема. Так как оно работает? В принципе – почти так же. Для того, чтобы определить, что игрок задел что-то выстрелом, клиент передает на сервер саму цель и намерение игрока выстрелить. Сервер считает разницу во времени, «возвращается в прошлое» на уже посчитанное время и проверяет – попал ли стрелок во что-нибудь. Если попал, то к цели «применяется» урон.



Однако, у этого метода есть два «но». Прежде всего, такой метод работает только с бесконечно быстрым оружием (hitscan), потому что в этом случае на самом деле не создается и не начинает бороздить время и пространство, собственно, пуля. Второе но – если у стрелка случился лаг в, скажем, 200 мсек, то человек, который должен был получить этот выстрел, вполне мог за эти 200 миллисекунд успеть забежать за укрытие. А благодаря тому, что стрелок, как бы, стреляет из будущего в прошлое, забежавший, уже было, за укрытие игрок вдруг умирает, потому что на момент выстрела был ясно виден стрелку. Уверен, каждый из вас, хоть рас сталкивался с этим.
Так что получается, скорее всего, в большинстве промахах виноват игрок, на пинг точно не посетовать.
Показать картинку


Настоящие пули.


Первая проблема Battlefield в том, что он создает пули. В Quake и других играх в матче участвуют порядка 16 игроков. Каждый раз когда вы пытаетесь узнать, получил ли кто-нибудь пулю, сервер просто возвращает всех игроков на правильные (с точки зрения задержки клиента) позиции, интерполирует время и наблюдает – получил кто пулю, или нет. Даже с очень «многопулевым» оружием это не создает особых проблем, особенно если вы можете немного схитрить и запихать несколько пуль в один сетевой пакет. Конечно и раньше были игры, променявшие старый добрый hitscan на снаряды, но они не вводили никакой компенсации задержки и делали снаряды сравнительно медленными. И это вот сильно затрудняло игру при большом пинге. Попробуйте как-нибудь поиграть в Team Fortress 2 с медицинской пушкой, на далеком-далеком сервере с большим пингом. Посмотрим, как у вас будет получаться =).



Однако в Battlefield, стреляя, вы создаете настоящие пули. Время жизни каждой пули около 1,5 секунд, а для пули, выпущенной из снайперской винтовки, – целых пять секунд. Учитывая, что большая часть оружия – штурмовые винтовки, мы получаем что-то около 700 выстрелов в минуту с очень большим количеством вероятных промахов. Более того: карты здесь настолько огромные, что большая часть пуль будет лететь весь отведенный им срок (а это, как мы помним, 1,5 секунды) перед тем, как их удалят со сцены. А самое жуткое то, что при все при этом приходится иметь дело с максимумом в 64 игрока и кучей боевой техники.
Это огромное количество динамических объектов, каждый шаг каждого из которых должен быть проверен на столкновение с чем бы то ни было. И при каждой такой проверке игре нужно двигать все назад во времени к собственному времени каждой проверяемой пули, которое было записано как время выстрела. И это на каждом шагу моделирования. Не только при выстрелах.

Техника и разрушаемость.


Другая большая проблема баттлфилда – разрушаемое окружение – это часть игрового дизайна. Здания и техника здесь могут получать урон, так же как и игроки. И если, для того, чтобы проверить не было ли что-нибудь «застрелено», вам необходимо путешествие во времени, то вам нужно двигать назад не только игроков, но и всю технику и все строения с поля боя. Правда, я не думаю, что это же самое надо делать для разрушений [зданий], потому как разрушения не создают новых препятствий для пуль. Щебень может быть легко прострелен насквозь, а если новое препятствие, вдруг, и возникает в результате разрушения, оно, скорее всего, не будет замечено из-за дыма, этим разрушением вызванного.



Трафик


64 игрока на поле боя, десятки единиц техники, тонны разрушений, ракет, пуль, оружия, стреляющего в разные стороны и черт его знает чего еще – огромное количество данных для передачи. Однако если вы, вдруг, посмотрите на трафик, создаваемый Battlefield, вы увидите, что он не так уж и высок. Я полагаю, что тут используется что-то похожее на сетевую модель, применявшуюся в Halo, которая, в свою очередь, создана на основе модели из Tribes. Halo добавил в нее такую вещь как различные степени приоритетов для всех передаваемых по сети объектов. Объекты, находящиеся далеко от игрока обновляются (на клиенте) гораздо реже, чем объекты вблизи.

Спасибо за внимание! Хороших хедшотов, господа.
Комментарии (21 шт.)
Предлагаю к ознаКомлению!
Слишком много Мерси в этом блоге, я не могу плюс не поставить)

Объяснил понятно и доходчиво, как всё работает. Да и с оформлением всё неплохо.
скрытый текст
Но картинки по центру выровняй) И пустые строки между некоторыми абзацами потерял, верни их.
Отличный блог — доходчиво о сложном :)

У меня теперь ощущение, что у нас в офисе туалет находится на сервере, иначе объяснить залитый людьми с плохим соединением с реальностью пол около туалетов просто невозможно :D

А по теме — очень хотел бы увидеть продолжение про неткод в других сетевых развлечениях и пул окказий, возникающих на его основе)
Как-то блог резко заканчивается, вроде ещё интересно почитать про сложности моделирования. Может где-то использовалась новинка в технологии, какой-нибудь прототип чего-нибудь, тоже было бы интересно глянуть.
Я думал особо не зайдёт, сократил, упростил, каюсь. Стивен Хокинг писал в своей книге «Черные дыры и молодые вселенные», что каждая формула вдвое сокращает количество читателейD.
Ну, во-первых это не квантовая физика, а во-вторых, тема щепетильная, и очень интересная. Ждём продолжения, в общем ( ͡° ͜つ ͡°)
В дополнение комментария Deenech'а добавлю, что я из тех, которых формулы наоборот привлекают, но это так.
Я думал, что это было в «Краткая история времени»

P.S.Хотя, может, он просто любит эту фразу и часто ее упоминает)
Если силы есть, сделай «расширенное издание» для задротов и просто тех, кому интересны подробности! Я бы, например, с удовольствием почитал! Думаю, ине я один.
БТВ, в блоге зашкаливающее количество Мерси, но при этом нет ни одного упоминания хит-регистрации в Овердроче, про которую я слышал много нелестного. Особенно, про хедшоты, которые можно ставить в башню противнику, который полностью скрыт за стеной.
В ArmA создаются пули, которые летят гораздо больше времени, для них просчитывается физика и всякое такое. При этом на сервере могут играть куда больше 64 человек одновременно. Так что DICE сосатт.
C динамикой армы, в чем проблема? Конечно она может, если игроки раз в пол часа стреляют.
Все хорошо, но только автор зря забыл упомянуть такую штуку на интерполяция. Некоторые игровые сервера не «мотают время назад», а вполне себе считают и обрабатывают поступающую инфу как есть, делая синхронизацию по таймингам. Клиент в свою очередь существует в «примерном будущем», демонстрируя то, что как бы должно произойти на основе прошлых данных. Так мы получаем плавное движение при низком тике сервера.

Оттуда мы имеем такие нюансы, когда ты вроде бы попал — даже анимация кровищи была, а вот сервер обсчитал и решил что пуля шла мимо. Такое происходит, когда клиент предсказал поведение не совсем корректно при низком тик-рейте (как раз упомянутых 20гц) и высоком пинге. Хорошие ФПС шутеры имеют тик-рейт от 50 и выше.

А еще тик-рейт может быть динамический. ПУБГ например считает начало матча с тиком около 20-30 и по мере убывания игроков растет до 60Гц.
Хорошая статья, познавательно. Но меня при чтении отвлекали гифки)
Как-то маловато для лучше Блога, если чесно. По сути, рассказан принцип на примере Кваки И Бугурфилда и все. Весь рассказ. Это как взять книгу про пинг, прочитать 1ю главу и хватит. ОЧЕНЬ МАЛА БУКАВ!
При чем не рассказан принцип, а рассказаны слухи о принципе, ведь автор не работает в DICE и не приводит 100% схем работы сетевого кода. Рассуждения на тему, не более того.
не обязательно видеть сетевой код, чтобы понять как он работает и что передает. Wireshark рулит :)

Но да, согласен — описание довольно поверхностное
Нужно боольше информации) Спасибо!
Тема пулек не раскрыта
Наиграв свыше 100 часов в любой мультиплеерный шутер уже знаю, какое упреждение надо брать на том или ином сервере, да. это «ну такая себе штука», однако позволяет держать далеко не самые последние места рейтинговых таблиц.
Видосик по теме от Overwatch Team:
Developer Update | Lets Talk Netcode | Overwatch
Косому стрелку всегда netcode мешает.
Для комментирования необходима регистрация.
Прямой эфир «Блоги»
Наконец-то дождались Dark Souls от мира аниме — Goblin Slayer
Персональный блог японского помощника
Курилка тега gallery
Блог курилок и длинных разговоров
Дефолтное мнение: Return of the Obra Dinn
Персональный блог Porontobello
Немного о взломе PlayStation 4: эксплоиты, их реализация и многое другое
Персональный блог cтатей и прочего творчества (by Starrkiller)
Поможем StopGame полюбить визуальные новеллы
Персональный блог японского помощника
[ХАЛЯВА] Место раздачи халявы V11!
Официальный бложик халявщиков на СГ
TDS игра по Ретрозору
"Модный" блог
Наверх ↑