Меню
StopGame  Блоги Блог Podokonnik Netcode в шутерах 2. Ты не всегда виноват!

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

  • «Инфакт» от 19.11.2018 — Sony не поедет на E3, новая Xbox One S, кастомизация в Anthem, бесплатная неделя в Overwatch…
  • Видеообзор игры Battlefield V
  • BlizzCon 2018: мобильное исчадие ада вместо Diablo 4
  • Обзор игры Steel Rats
  • Обзор игры Kursk
  • Видеообзор игры The Quiet Man
  • Обзор игры 11-11: Memories Retold
  • Battlefield V.WWII
  • Resident Evil: Remake. Возвращение в ОСОБНЯК!
  • Обзор игры Tetris Effect
  • Видеообзор игры Overkill's The Walking Dead
  • Рассвет кровопийц — рецензия на второй сезон сериала Castlevania
  • Обзор игры Sports Party
  • Превью по пресс-версии к игре Conqueror's Blade
  • Overkill's The Walking Dead. Мёртвый дед
  • «Связанные». Игрочтиво
  • Пользовательский обзор недели
  • Полная история браузерных ферм
  • Обзор игры Nickelodeon Kart Racers
  • Самый быстрый секс в Fallout! [Спидран в деталях]
  • For Honor: Marching Fire. Марш в огонь!
  • Warcraft 3 Reforged. Прямой эфир с Blizzcon
  • Душевный подкаст №16 — разносим Red Dead Redemption 2, хвалим Black Ops 4, переживаем за Siege
  • For Honor: Marching Fire. Жопа в огне
  • Dangerous & Dragons. Дело: плохо
  • Dead by Daylight. Хеллоуинский замес
  • Silent Hill 4. Страх с доставкой на дом
  • «Своя игра» на Хэллоуин!
  • 10 лайфхаков для настоящего ковбоя
  • Самые ожидаемые игры. Ноябрь 2018

Netcode в шутерах 2. Ты не всегда виноват!

+41

Введение.


Привет, ребятушки. Продолжение блога:
Netcode в шутерах. Почему ты промахиваешься?
В предыдущей части я упомянул «пересчеты игровой ситуации в секунду», их там было, для примера — 20. Об этом, в основном, мы и поговорим в этой статье. Чуть сложнее, но ничего сверхъестественного.

Частота обновления сервера

При игре, вы обмениваетесь с сервером данными. И насколько часто вы обмениваетесь данными зависит именно от TickRate. Каждый Tick сервер и клиент обновляют данные (синхронизируются), обновляется игровая зона, перемещения игроков, выстрелы и т.д… Соответственно чем чаще он это делает, тем более игра приближена к реальности у каждого игрока.

Tickrate – это единица измерения частоты отправки и получения пакетов данных между игровым сервером и клиентом в секунду.



Почему вообще заданная частота сервера, то есть TickRate, имеет место быть? Почему бы серверу сразу не считывать ввод клиентов; обновлять состояние игры; отправлять его обратно на клиенты.
Всё дело в том, что когда клиентов много, они очень часто отправляют команды. Обновление игрового мира для каждой команды и последующее оповещение всех клиентов об измененном состоянии основательно нагрузило бы процессор и сеть.
Более удачным подходом было бы накапливать все команды без выполнения. Вместо этого мир будет обновляться периодично с низкой частотой, например, те же 20 раз в секунду. Во время каждого обновления все накопленные команды применяются и новое состояние игры рассылается по клиентам.
Высокий TickRate позволяет максимально приблизиться к ситуации, которую сервер считает правильной. Такой TickRate увеличивает нагрузку на клиентскую часть и серверную, в особенности. Поэтому на серверах часто используют 64 TickRate. Вы никак не можете повлиять на TickRate играя на сервере, так как TickRate определяет сам сервер. Если в конфиге сервера TickRate 64, а у вас на клиенте по умолчание 128, то вы все равно будете играть на 64 Hz и наоборот.

Представьте ситуацию (а скорее всего, вспомните): Вы прицелились снайперской винтовкой прямо в голову противнику. На выдохе, спокойно, спустили курок. Вы уверены в своих силах, вы не можете промахнуться.

Но вы промахнулись!

Почему это произошло? Как такое случилось?

Дело в том, что ваш клиент отправляет данные на сервер, сервер сопоставляет полученные данные, и принимает окончательное решение. Если сервер считает, что вы не попали в тик, игрок не получает урона((. А вам, кажется, что вы попали, потому что, отображение крови и попаданий находится на стороне клиента (на вашем компуктере). Получается, на вашем экране, вы видели голову противника между тиками? Как такое возможно? Об этом, дальше.
Очень полезно
Да, если вам надо оправдать свой промах, грамотно гнать на TickRate))

Сейчас я приведу примерную информацию по тикрейту в разных соревновательных шутерах:
Overwatch — 64 Hz
CS GO — 64 Hz (Турики гоняются на 128 Hz)
Battlefield 1 — 60 Hz
Quake Champions — 60 Hz
Rainbow Six Siege — 64 Hz
PUBG — 60 Hz (примерно. Не так давно, как я понял, в начале карты, по понятным причинам, было 30 и поднималось до 60 по мере убывания игроков.)
Battlefield V — 64 Hz будет, вроде.



Возникает резонный вопрос: «Почему популярнейшие и дорогие проекты имеют не 128 тикрейт?».
Разработчика CS GO спросили за TickRate, на что получили вполне осмысленный ответ:



Ответ: «Вопрос [про тикрейт 128] не глупый, мы часто его получаем. Проблема в том, что часть игроков окажется в невыгодном положении на серверах с тикрейтом 128, потому что их система медленнее. Нам бы пришлось разделить базу пользователей, что привело бы к более продолжительному поиску матчей. Впрочем, это может иметь смысл.»

Согласиться можно, но я бы добавил, что, скорее всего, компании работают на количество серверов в разных местах, чем на их качество, потому что 128 TickRate — це довольно дорого, а искушённых игроков, готовых в этом разбираться не так много. (это чистое ИМХО).

Справляемся с редкими обновлениями

Для наглядности мы будем использовать в нашем примере Тикрейт — 10 Hz. (1000 мс/10 Hz=100 мс)
Пока игрок один, с его точки зрения все работает так же гладко и мгновенно как и раньше, так как предсказание (см.доп.информацию ниже) на стороне клиента работает вне зависимости от частоты ответов сервера.
Но ему приходят слишком редкие обновления о том, что происходит на сервере с другими игроками. Реализация других игроков работает так: клиент применяет обновление состояния другого игрока, как только получает его. Естественно, это приводит к рывкам, так как частота обновления вражеских игроков будет 10 кадров в секунду.
Проблема не только в этом, даже если сервер отправляет обновления 60 раз в секунду, это не значит что клиент будет получать их 60 раз в секунду. Сети не надежны — пакет с очередным обновлением может придти позже, чем хотелось бы, или вообще не дойти, так что игрок все равно увидит рывки. Но, если у тебя, например, 144 Hz монитор, значит ли это то, что противники у вас на экране перемещаются в 64 кадра? Нет! В зависимости от типа разрабатываемой игры, есть различные способы бороться с этим. Причем, чем более предсказуема игра, тем проще выйти из этой ситуации.


Экстраполяция


Предположим, что вы делаете гонки. Машины довольно предсказуемы — если машина едет 100 м/с, через секунду она будет примерно на 100 метров впереди от того места, где она была.

Почему “примерно”? В течении этой секунды машина могла немного ускориться, или затормозить; немного повернуться. Ключевое слово здесь — немного. Машины устроены так, что позиция преимущественно зависит от предыдущей позиции, скорости и направления; и в меньшей степени от действий пользователя. Другими словами, гоночная машина не может мгновенно развернуться на 180 градусов.

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

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

Этот метод подойдет только для объектов с большой инерцией: машины, корабли.

Интерполяция


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

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

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

Пусть вы получаете позиции в момент t = 1000. Вы уже получили информацию о t = 900, так что от t = 1000 до t = 1100, вы показываете что этот игрок делал с t = 900 до t = 1000. Таким образом вы показываете настоящее передвижение врагов, но на 100 мс позже.

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



Но есть исключения — если нужна высокая пространственная и временная точность, например при выстреле одного игрока в другого. Так как другие игроки видны в прошлом, вы целитесь с задержкой в 100 мс + пинг, то есть туда, где враг был более 100 мс назад! Это как быть снайпером в мире, где скорость света безумно, просто ничтожно мала. Вы целитесь в соперника, но к тому моменту, как до вас дошел свет, его уже давно нет на старой позиции. С компенсированием этого лага мы разобрались в предыдущем блоге.
Это интересно
Если кто не в курсе. Человеческий глаз не видит окружающий мир, но видит свет отражённый от объектов. А, так как, у света есть конечная скорость, то получается, что вы смотрите на всё в прошлом. Если бы инопланетяне смотрели на нашу планету в супер крутой телескоп из другой галактики, то могли бы увидеть динозавров. Астрономы нашли, даже, галактику, настолько удалённую от нас, что свет от неё показывает, примерно, 200 млн лет после «Большого Взрыва»


Дополнительная информация

1. Есть такая штука как «предсказание на стороне клиента».
Например, если игрок нажимает стрелку влево, персонаж начнет двигаться через полсекунды. Это происходит, потому что команда должна дойти до сервера, а результат команды после этого должен дойти до клиента.
В интернете, где задержки могут составлять десятые доли секунды, геймплей в лучшем случае будет неотзывчивым, а в худшем — неиграбельным.
Несмотря на то что некоторые игроки пытаются читерить, большую часть времени сервер получает корректные запросы. Это означает, что полученный ввод будет корректным и игра обновится так, как ожидается. То есть если персонаж находится на (10, 10) и отправляет команду на движение вправо, он окажется на (11, 10).

Мы можем использовать это если игра достаточно детерменирована (то есть результат определен командами и предыдущим состоянием).

Предположим что у нас лаг 100 мс и время перемещения персонажа составляет 100 мс. Время действия составит 200 мс.

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

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

2.

Для укладывания информации в голове, разумно было объединить интерполяцию с темой Tickrate'a.
btw, сделано!

3.

В Овервотче, до начала 17 года, был тикрейт — 20, вот люди и горели, насколько я знаю. А есть ли сейчас какие-то такие проблемы… ну я не знаю, мне сложно судить с моего убогого даймонда.
Про башни
у всех персонажей в овервотч, хитбокс врага немного больше модельки. У проджектайл снарядов он ещё больше. У Шидошмэйкер самый честный, вроде .

Итог



Tickrate – это единица измерения частоты отправки и получения пакетов данных между игровым сервером и клиентом в секунду.

Экстраполяция — применяется когда позиция может быть предсказана исходя из предыдущей информации — позиции, скорости и ускорения.

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

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

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

Спасибо за внимание!


P.S. Неиспользованные мемы. Все ведь любят мемы?
Показать картинку

Показать картинку

P.S.S. 05.11.2018, в 7.29, я подредактировал содержимое в «Частота обновление сервера». Если кто-то успел сломать мозг, прошу прощения.
Комментарии (57 шт.)
Предлагаю к ознаКомлению!
P.S.S. 05.11.2018, в 7.29, я подредактировал содержимое в «Частота обновление сервера». Если кто-то успел сломать мозг, прошу прощения.
спасибо
комментарий удален
у всех персонажей в овервотч, хитбокс врага немного больше модельки
Обычно это проще называют
Ну или так D
У стрел ханзо самый маленький хитбокс если что, вот кто действительно струляет брёвнами так ето мерка и дивка из своих пукалетов
Статью прочитал, но ничего не понял. Как будет свободное время, то смогу перечитать.

Касательно тикрейта. Если я не ошибаюсь, в Tom Clancy's Rainbow Six: Siege он непостоянный. Тоже самое касается и PlayerUnknown's Battlegrounds. Об этом ты уже писал выше. И мне вот этот момент вообще не понятен. Т.е в том же Counter-Strike: Global Offensive или Overwatch у тебя постоянный тикрейт, а вот в этих двух играх нет.
Ну да, по диагонали не получится вникнуть, но я всё рассовывал по полочкам у себя в голове, так и писал. Попробуй забыть про первую статью, где больше внимания уделено компенсации лага (компенсации задержки) только с пингом. И прочитай на свежую голову эту статью. В нынешней, задержка не только от пинга, но и от последствия интерполяции(враги в прошом). Но компенсируется, так же, отправляясь в прошлое, что описано в первой статье. хз как попроще написать. (меня, вообще, просили посложнее и поподробней).
То есть, если у тебя 10 пинг, твоя задержка — 100 мс+10 мс =110 мс.
Если у тебя пинг 0, твоя задержка — 100 мс
Не стоит подстраиваться под одного человека. Это исключительно мои проблемы, что некоторые слова в твоей статье я не понимаю.

После этого ответа, меня интересует вопрос: Как узнать, где у меня задержка, а где пинг? Ибо в русской версии, вместо слова задержка и в некоторых играх, пишется пинг.
Кстати говоря! Хочу тебе порекомендовать одну программу, которая позволяет измерять тикрейт в реально времени. Называется Тикметр. Этот софт создал парень, ник у которого «Белларуский ITшник». Но ты будешь его использовать на свой страх и риск. Парень, который тестировал эту программу в PlayerUnknown's Battlegrounds тестировал ее и забанен не был.
«Беллоруский ITшник»


Прошу прощения. Опечатался.

*Fix
Белорусский ITшник


Еще одну опечатку увидел.

*Fix
«Я не виноват, это все неткод!». Любимая отмазка)
В самом деле, не ты ведь промахнулся^^
А какой тикрейт был в 1.6?
сдаётся мне команды cl_cmdrate 128 и cl_cmdupdaterate 128 не зря прописывались всегда
вроде в CSS, даже, можно было 128 сделать
комментарий удален
У меня в Овере интерполяция 20-24 показывает. Это значит и тикрейт 20? Слышал, что только в кастомках 60 тикрейт, а в остальном 20.
А в чем проблема в сейдже, абсолютно не могу в него играть, пример противник появляется на долю секунды и сразу убивает тебя, а на повторе он выглянул прицелился не спеша и выстрелил.
В том, что Юбики жлобятся на региональные сервера.
Крайне полезно. Спасибо за статью. Без инфакта не узнал бы…
В овере ничего не поменялось. У них еще и хитрег не пофикшен с беты.
У овера топ 3 хтрегов на рынке, почти идеал.
Тебе Каплан об этом сказал? В игре частая проблема, когда хедшоты не защитываются. Близы об этой проблеме знают и пока не починили.
мне это сказал чел, который тестирует сетевую составляющую игр. Ни разу за всё время (играю с 3го сезона) не было такой проблемы.
комментарий удален
Поэтому уже много лет не играю в сетевые шутеры. Когда пришло понимание, что воюешь не с противниками, а с тиками, пингами, хитбоксами, по ту сторону экрана. И с собственным железом, герцами, сенсой и разрешением экрана.
комментарий удален
Порыв конечно хороший, но есть же Battlenonsense, который всю эту тему подробно разжёвывает и делает тесты каждой новой крупной сетевой игры+ его английский довольно прост для понимания. Но можешь у него чё подчерпнуть конечно, в ру сегменте таких разборов не делают.
комментарий удален
комментарий удален
комментарий удален
Насколько я знаю, все игры с выделенными серверами работаю на 20фпс. Овервоч как то раз временно на американский регион поднимала только до 60, как рекламу самого-самого шутера.
Если игроки привыкли играть на 20, зачем платить в 3 раза больше за трафик и аренду серверов? По вашему издатели тупые?
По PUBG уже устаревшая инфа если судить по видео Battle(non)sense
Стабильный тикрейт 60
комментарий удален
супер
комментарий удален
комментарий удален
комментарий удален
комментарий удален
Можно фулл первого арта? Не другу, мне.
Кто потёр комменты с обвинениями в плагиате?
Очевидно, что автор. И, видимо, обвинения обоснованные.
Ну, сложно найти лучшее подтверждение от самого автора)
А разве автор может тереть комменты?
С лёгкостью
Ох вау. Я думал, только админы и модерация.
Экая милота. И ему ничего за это не будет?
Я так понял, что этим уже админы занимаются. Несколько людей уже халтуру заметили.
Редакция СГ уже в курсе, какие меры будут к автору — не ясно, правда.
В своем Блоге — может. За это даже ачивка «Недотрога» есть.
Ачивки СГ умеют в троллинг) Меня в свое время рассмешила та, которую дают за смену пола в профиле
Охохо, оперативно потёр комменты? Ну хорошо, теперь хотя бы сомнений теперь нет, скамуниздил статью и доволен, поздравляю с незаслуженно заработанным косарём. Надеюсь стопгейм в дальнейшем будет хоть немного проверять материал на плагиат, а то как-то тупо получается…
А плюсы всё идут(
Мне не очень понятно, почему нельзя отключить, что бы Блог выскакивал на главной. Не было бы этого — не было бы плюсов. Мало кто читает комментарии.
Для комментирования необходима регистрация.
Прямой эфир «Блоги»
Игрочтиво: Стримы визуальных новелл на stopgame.ru
Персональный блог Аниматора port154
Курилка тега gallery
Блог курилок и длинных разговоров
Приторный грек
Блог обзорщиков
Вестерн Игры
Блог SparrowKing
Сервис Project xCloud: мне бы в небо, а лучше в Cloud
Персональный блог крути мозгами
Наверх ↑