Soushi

/r/OW/netcode_ru

Jun 7th, 2016
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 24.17 KB | None | 0 0
  1. В последнее время стал периодически наталкиваться на вопли о плохом неткоде Овервоча и споры о «хуке» Роадхога (хитскан он или не хитскан). Гугл дал пару любопытных статей на эту тему и я замутил перевод, чтобы было куда посылать не владеющих английским языком. Репосты в тематические форумы/группы приветствуются, с сохранением ссылок на оригиналы и указанием автора перевода (Soushi#2221).
  2.  
  3. Все, что нужно знать о тик-рейтах, интерполяции, компенсации лага и т.п.
  4. (оригинал на английском: https://www.reddit.com/r/Overwatch/comments/3u5kfg/everything_you_need_to_know_about_tick_rate/)
  5.  
  6. Привет народ. Во множестве мест идут обсуждения тик-рейтов и общей производительности Overwatch’а и, к сожалению, в этих дискуссиях проявляется очень много заблуждений. Я решил написать этот пост для того, чтобы разъяснить терминологию и люди могли лучше понимать все факторы,
  7. которые влияют на то, как ведет себя игра.
  8.  
  9. Вступление:
  10. Практически во всех современных шутерах сервер отвечает за состояние игры (game state). Это важно для предотвращения читертва, но ведет к некоторым проблемам, с которыми сталкиваются игроки. При разработке клиент-серверной игры всегда будет существовать проблема в разнице между состоянием игры, которое «видит» клиент и состоянием игры на сервере. Получается, что клиент видит состояние игры с запозданием от «настоящего» состояния на сервере. Эта проблема будет присутствовать всегда, но есть возможности сделать так, чтобы это было менее заметно.
  11.  
  12. Сетевой код (неткод, Netcode).
  13. Общий термин, означающий сетевую составляющую программного кода игры. Это, по сути, бессмысленный общий термин, не указывающий на что-то конкретное и не являющийся техническим.
  14.  
  15. Круговая задержка (Latency).
  16. Также часто (и ошибочно) называется «пингом» (ping). Задержка - это время, которое требуется сетевому пакету, отправленному с твоего компьютера, чтобы дойти до сервера и вернуться обратно на твой компьютер («круговая задержка» или RTT). Причина, по которой задержка зовется «Пингом» в том, что так называется программа для проверки и измерения задержек, написанная еще в 80-х годах. Команда “ping” присутствует в большинстве современных операционных систем по сей день. Другими словами, пинг это тест, который использует специальные сетевые пакеты (ICMP echo) для измерения задержки между двумя узлами. Стоит заметить, что время прохождения пакета в одну сторону (от компьютера до сервера, например) не всегда является половиной «общего» времени задержки, но для простоты условимся, что это так. В дальнейшем я буду называть круговую задержку просто «задержкой», а время прохождения пакета в одну сторону – «половиной задержки».
  17.  
  18. Тик-рейт (Tick rate).
  19. Тик-рейт это частота, с которой сервер обновляет состояние игры. Измеряется в Герцах. Когда на сервере установлен тик-рейт в 64 Гц это означает, что он может посылать пакеты клиенту не чаще, чем 64 раза в секунду. Эти пакеты содержат обновления состояния игры и включают такие вещи, как расположение игроков и объектов. Длительность тика - это просто его продолжительность в миллисекундах. Например, 64 тика будут иметь длительность в 15,6 мс каждый, 20 тиков – 50 мс, 10 тиков – 100 мс и т. д.
  20.  
  21. Скорость обновления клиента (Client Update Rate).
  22. Скорость, на которой клиент может принимать обновления от сервера. Например, если скорость обновления клиента составляет 20, а сервер имеет тик-рейт в 64, то клиент все равно получает не более 20 обновлений в секунду и мог бы, с тем же успехом, играть на сервере с тик-рейтом 20. Этот параметр, зачастую, настраивается локально, в самом клиенте, но в некоторых играх он не может быть изменен.
  23.  
  24. Частота кадров (Framerate).
  25. Количество кадров изображения, которое способен вывести на монитор клиент игры за секунду. Чаще всего обозначается как FPS или просто как «... кадров в секунду».
  26.  
  27. Частота обновления монитора (Refresh Rate).
  28. Частота, с которой твой монитор обновляет изображение, полученное от видеокарты. Измеряется в Герцах. Например, если игра выдает 30 кадров в секунду, то монитор с частотой в 60 Гц будет показывать каждый кадр дважды. Если у тебя частота кадров 120 на 60 Гц мониторе, то монитор все равно может показать только 60 кадров в секунду. Большинство мониторов имеют частоту в 60 Гц или 120 Гц.
  29.  
  30. Интерполяция (Interpolation).
  31. Интерполяция - это технология, которая сглаживает передвижения объектов в игре (например, игроков) между двумя точками. Задержка интерполяции обычно составляет 2 тика, но может и отличаться.
  32. Например, если игрок бежит по прямой линии и в момент «Тика 1» он находится на расстоянии 0,5 метра, а в момент «Тика 2» - на расстоянии 1 метр, то интерполяция позволит клиенту игры показать это как плавное движение персонажа с 0,5 м до 1 м. Сервер, однако, «видит» игрока только в этих двух точках и никогда между ними. Без интерполяции игры казались бы очень «дерганными», потому что клиент отображал бы движение объектов только при получении обновления от сервера. Интерполяция происходит исключительно на клиенте.
  33. По сути, интерполяция замедляет частоту, с которой игра отображается на компьютере, на время обычно равное двум тикам (некоторые игры позволяют настраивать этот параметр, например, CSGO). Это именно то, что имеют ввиду игроки, когда говорят о «рейтах». Они говорят о скорости обновления клиента и задержке интерполяции. Для CSGO, например, стандартный период интерполяции составляет 31 мс для серверов с тик-рейтом в 64 Гц.
  34.  
  35. Экстраполяция (Extrapolation).
  36. Это еще одна технология для клиента, которая может быть использована для компенсации лагов. В общих словах, клиент предугадывает (экстраполирует) расположение объектов, вместо задержки всего рендера. Этот метод сильно проигрывает интерполяции, особенно в шутерах, т.к. передвижения игроков непредсказуемы.
  37.  
  38. «Хитбокс» (Hit Box).
  39. Трехмерная модель персонажа, показывающая зоны, которые считаются «попаданием». Хитбокс нельзя увидеть в игре, тебе видна только модель персонажа. Хитбоксы могут быть больше или меньше самой модели, или быть неточными в каких-то местах, в зависимости от игры. Это может намного сильней влиять на промахи и попадания в игре, чем тик-рейты.
  40.  
  41. Компенсация лага (Lag Compensation).
  42. Компенсация лага - это функция на сервере, которая пытается снизить видимость задержек клиента. Без компенсации (или с плохой компенсацией) лага тебе придется стрелять «на упреждение», чтобы попасть в цель, т.к. твой клиент «видит» игру с задержкой. Компенсация лага занимается тем, что рассматривает все действия, совершенные в игре, так, как будто они произошли в прошлом.
  43. Разница между состоянием игры на сервере и на клиенте, или «задержка клиента», как мы будем ее называть, может быть просчитана как: ЗадержкаКлиента = (1/2*Задержка)+ЗадержкаИнтерполяции
  44.  
  45. Пример компенсации лага в действии:
  46. * Игрок А видит, как игрок Б подбегает к углу.
  47. * Игрок А нажимает на выстрел, клиент отправляет это действие на сервер.
  48. * Сервер получает это действие через Х мс, где Х – половина задержки игрока А.
  49. * Затем сервер смотрит в прошлое (в буфер памяти), на то, где был игрок Б в тот момент, когда игроа А нажал на выстрел. В нашем примере сервер вернется на Х мс + задержку интерполяции игрока А, с целью определить, что игрок А видел на экране в момент выстрела (могут быть и другие переменные, в зависимости от того, как программисты решили сделать компенсацию лага).
  50. * Сервер решает, были ли произведенный выстрел попаданием. Чтобы выстрел засчитался за попадание он должен совпадать с хитбоксом игрока. В этом примере сервер засчитывает попадание. Даже если на экране игрока Б это может выглядеть как будто он уже свернул за угол, из-за разницы во времени между тем, что видит игрок Б и тем моментом, когда сервер засчитал попадание, которое равно: (1/2*ЗадержкаИгрокаА + 1/2*ЗадержкаИгрокаБ + ВремяСПоследнегоТика)
  51. * При следующем тике сервер отправляет обоим клиентам обновления, содержащие исход ситуации. Игрок А видит индикатор попадания в цель, Игрок Б видит снижение кол-ва «жизни» или свою смерть.
  52. Примечание: когда два игрока стреляют друг в друга и оба попадают, итог может быть различным и зависит от игры. В некоторых играх, например, CSGO, если первый выстрел, пришедший на сервер убивает цель, то все последующие выстрелы, сделанные убитым игроком, не засчитываются и будут проигнорированы сервером. В этом случае невозможны «взаимные убийства», когда оба игрока стреляют друг в друга в течении 1 тика и оба умирают. В Овервоче взаимные убийства возможны.
  53. * Если используется модель CSGO, то у людей с низкой задержкой появляется существенное преимущество и могут возникать ситуации как «Я же в него выстрелил перед смертью, но он не умер!». Ты можешь даже услышать звук своего выстрела перед смертью, но урона не нанести.
  54. * Если используется текущая модель Овервоча, то небольшие задержки в реакции имеют меньшее значение. Т.е. если тик-рейт сервера 64, для примера, игрок А стреляет на 15 мс раньше, чем игрок Б, но они оба выстрелили в течении 15,6 мс одного тика, то они оба умрут.
  55. * Если компенсация лага слишком завышена, то будет «Я стреляю за целью и все равно попадаю».
  56. * Если компенсация занижена, то будет «Мне надо стрелять на упреждение, чтобы попасть».
  57.  
  58. Что все это значит для Овервоча.
  59. В большинстве случаев сервер с более высоким тик-рейтом даст более плавное и точное взаимодействие между игроками, однако важно не забывать о других факторах. Если мы сравним тик-рейт 64 (CSGO матчмейкинг) и тик-рейт 20 (бета-сервера OW, по утверждениям некоторых), то наивысшая задержка, которую можно испытать, составит 35 мс. В среднем она будет равна 17,5 мс. Для большинства людей эта разница незаметна, но опытные игроки, игравшие на северах с разным тик-рейтом, могут заметить разницу между 10-20 и 64 тиками.
  60. Не стоит забывать о том, что высокий тик-рейт не влияет на то, как работает компенсация лага, поэтому все равно будут случаи, когда ты уже забежал за угол, а потом умер. Сервера с тик-рейтом 64 эту проблему не решают.
  61. Если тебя беспокоит производительность игры, то есть несколько вещей, которые нужно проверить в первую очередь. Они могут существенно повлиять на поведение игры:
  62. * Твое подключение к интернету. Чем меньше задержка, тем лучше. Именно поэтому важно играть на тех серверах, до которых меньше задержка. Также, любые «перегрузки» твоего домашнего канала могут вызывать увеличение задержек. Компенсация лага помогает с «я стреляю во что-то», но при высоких задержках больше вероятность испытать «я забежал за угол и умер» или «я выстрелил первым, но все равно умер».
  63. * Если у твоего клиента низкая частота кадров (ниже частоты обновления монитора), то это вызовет увеличение ощутимой задержки, зачастую намного более сильное, чем разница в тик-рейтах.
  64. * Если частота обновления твоего монитора 60 Гц, то ты вряд ли заметишь разницу между серверами с тик-рейтом в 64 и 128, потому как твой монитор не способен отобразить эту разницу.
  65.  
  66. Заключение:
  67. Мы не знаем точных цифр по тик-рейтам серверов Овервотча, я видел тред с разбором трафика и он показывает, что клиент получает пакеты каждые 50 мс. Это говорит о тик-рейте 20, но только в том случае, если тик-рейт клиента равен тик-рейту сервера. Часто скорость обновления клиента задается локально, в самом клиенте, который отправляет на сервер параметры соединения. После чего сервер будет отправлять обновления с указанной частотой. Сервер, на самом деле, может работать на более высоком тик-рейте, но если скорость обновления клиента установлена на 20 тиков, то сервер будет отправлять пакеты лишь каждые 50мс.
  68. Поэтому, прежде чем поносить разработчиков за 20-тиковые сервера, стоит сперва понять какие там на самом деле параметры и может ли быть изменена частота обновления клиента локально, через конфиги.
  69.  
  70. TL;DR: Очень мало кто понимает «неткод», но все с радостью вайнят о нем, когда их убивают за стеной.
  71.  
  72. Ну и, собственно, сам пост про «хук» Роадхога, с которого всё началось.
  73. (пост от /r/nakomaru, оригинал на английском: https://www.reddit.com/r/Overwatch/comments/4m7gge/if_blizzard_wants_overwatch_to_be_the_competitive/d3u5aur)
  74. [«Хук» не хитскан], вот доказательство. Элементарно проверяется в тренировке:
  75. https://i.imgur.com/rh8rVTN.gifv
  76. Это снаряд (projectile), точно такой же, как ракеты/гранаты/сосули. Это не хитскан (оружие с хитсканом мнгновенно проверяет пересечение хитбокса с траекторией пули, вне зависимости от задержек, снаряды же проверяют циклично, в течении времени, пока снаряд находится в полете, тоже вне зависимости от задержки *в Овервоче*).
  77. Однако, снаряды симулируются и просчитываются на СТОРОНЕ КЛИЕНТА, поэтому без разницы, что ты увернулся от него на своем экране. Стрелок может «отмотать» тебя назад до 250 мс, в зависимости от его задержки и в случае, если он попал в тебя внутри симуляции на своем клиенте. Повышение тик-рейта клиента до 60 не сделает погоды. Это работает компенсация лага.
  78.  
  79. Причина, по которой поведения Овервоча путает так много людей в том, что в очень старых играх ни хитскан, ни снаряды не симулировались на клиенте. Все просчитывалось исключительно на сервере (и Railgun и RL в Quake 2 имеют небольшую паузу перед выстрелом, равную задержке). Около десятилетия множество игр опиралось на данные клиента, при использовании хитскан-оружия, что позволяло снайперить не глядя на задержку. В Овервоче данные клиента используются даже при просчете попаданий снарядами, что достаточно ново. Задержки абсолютно не вызывают запозданий, когда ты стреляешь ракетой/сосулькой/хуком. Если ты попал у себя на экране, то сервер засчитает попадание (прим.: взрыв, однако, будет просчитан на сервере).
  80.  
  81. Разрабы специально сделали так, чтобы стрельба из оружия при высокой задержке или низком тик-рейте велась так, как будто задержки вообще нет. Не стреляйте из хитскан пушек на упреждение. Для снарядов рассчитывайте только время полета, без поправки на задержку. Это значит, что стрельба в Овервоче всегда будет ощущаться на отлично, а получение урона, особенно от игроков с большой задержкой, иногда может казаться фигней.
Add Comment
Please, Sign In to add comment