Сетевой код
Сетевой код — это общий термин , который чаще всего используется геймерами применительно к сети в онлайн-играх и часто относится к проблемам синхронизации между клиентами и серверами. Игроки часто делают вывод о «плохих сетевых кодах», когда у них возникают задержки или когда их входные данные пропадают. Общие причины таких проблем включают высокую задержку между сервером и клиентом, потерю пакетов , перегрузку сети и внешние факторы, независимые от качества сети, такие как время рендеринга кадров или непостоянная частота кадров . [1] [2] Сетевые коды могут быть разработаны для обеспечения синхронного и бесперебойного взаимодействия между пользователями, несмотря на эти сетевые проблемы.
Типы сетевых кодов [ править ]
В отличие от локальной игры, где входные данные всех игроков выполняются мгновенно в одной и той же симуляции или экземпляре игры, в онлайн-игре существует несколько параллельных симуляций (по одной для каждого игрока), где входные данные от соответствующих игроков поступают мгновенно, а входные данные для того же кадра от других игроков поступают с определенной задержкой (большей или меньшей в зависимости от физического расстояния между игроками, качества и скорости сетевых соединений игроков и т. д.). [3] Во время онлайн-матча игры должны получать и обрабатывать вводимые игроками данные в течение определенного времени для каждого кадра (равного 16,66 мс на кадр при 60 кадрах в секунду ), и если ввод удаленным игроком определенного кадра (например, кадра номер 10) поступает, когда другой уже запущен (например, в кадре номер 20, через 166.66 мс), происходит десинхронизация между симуляциями игроков. Есть два основных решения, позволяющих разрешить этот конфликт и обеспечить бесперебойную работу игры:
На основе задержки [ править ]
Классическим решением этой проблемы является использование сетевого кода на основе задержки. Когда вводимые данные от удаленного игрока поступают с опозданием, игра соответствующим образом задерживает вводимые данные от локального игрока, чтобы синхронизировать два ввода и запустить их одновременно. Эта дополнительная задержка может мешать игрокам (особенно при высокой задержке), но в целом изменение не очень заметно. Однако эти задержки могут быть непостоянными из-за внезапных колебаний текущей задержки. Если задержка между игроками превышает установленное окно буфера для удаленного игрока, игра должна ждать, в результате чего экраны «зависают». Это происходит потому, что сетевой код, основанный на задержке, не позволяет продолжать симуляцию до тех пор, пока не получит входные данные от всех игроков в рассматриваемом кадре. [4] Эта переменная задержка приводит к непоследовательной и неотзывчивой игре по сравнению с игрой в автономном режиме (или с игрой по локальной сети ) и может негативно повлиять на производительность игрока в чувствительных к времени и динамичных жанрах, таких как файтинги . [5]
Откат [ править ]
Альтернативой предыдущему сетевому коду является сетевой код отката. Эта система немедленно обрабатывает входные данные локального игрока (чтобы они не задерживались, как в случае с сетевым кодом на основе задержки), как если бы это была офлайн-игра, и прогнозирует входные данные удаленного игрока или игроков вместо того, чтобы ждать их (при условии, что они введут тот же ввод, что и в предыдущем тике). Как только эти удаленные входные данные поступят (предположим, через 45 мс), игра может действовать двумя способами: если прогноз верен, игра продолжается как есть, совершенно непрерывно; если прогноз был неверным, состояние игры возвращается, и игровой процесс продолжается из исправленного состояния, что рассматривается как «прыжок» к другому игроку или игрокам (что соответствует 45 мс, как показано в примере). [1] В некоторых играх используется гибридное решение, чтобы замаскировать эти «прыжки» (которые могут стать проблематичными по мере роста задержки между игроками, поскольку остается все меньше и меньше времени на реакцию на действия других игроков) с фиксированной задержкой ввода и последующим использованием отката. . Откат весьма эффективен для сокрытия скачков задержки или других проблем, связанных с несогласованностью соединений пользователей, поскольку прогнозы часто оказываются верными, а игроки даже не замечают этого. Тем не менее, эта система может вызывать проблемы всякий раз, когда игра клиента замедляется (обычно из-за перегрева), поскольку могут возникнуть проблемы с разломами, приводящие к обмену билетов между машинами по неравным ставкам. Это приводит к появлению визуальных сбоев , которые прерывают игровой процесс тех игроков, которые получают вводимые данные в более медленном темпе, в то время как игрок, чья игра замедлена, будет иметь преимущество перед остальными, получая вводимые данные от других с нормальной скоростью (это известно как одно- боковой откат). [6] Чтобы справиться с этим неравномерным входным потоком (и, следовательно, с неравномерным потоком кадров), существуют стандартные решения, такие как ожидание поступления поздних записей на все машины (аналогично модели сетевого кода на основе задержки) или более изобретательные решения. [ нужна ссылка ] решения, подобные тому, которое в настоящее время используется в Skullgirls , которое заключается в систематическом пропуске одного кадра каждые семь, чтобы, когда игра сталкивается с рассматриваемой проблемой, она могла восстановить пропущенные кадры, чтобы постепенно синхронизировать экземпляры игр на различных машинах. . [7]
Сетевой код отката требует, чтобы игровой движок имел возможность возвращать свое состояние назад, что требует внесения изменений во многие существующие движки, и, следовательно, реализация этой системы может быть проблематичной и дорогой в играх типа ААА (которые обычно имеют надежный движок и высокую производительность). -traffic network), как прокомментировал , среди прочего, продюсер Dragon Ball FighterZ Томоко Хироки. [8]
Хотя эта система часто ассоциируется с одноранговой архитектурой и файтингами, существуют формы сети отката, которые также часто используются в архитектурах клиент-сервер (например, агрессивные планировщики, обнаруженные в системах управления базами данных, включают функцию отката) и в других жанрах видеоигр . [1]
Существует популярная библиотека GGPO , лицензированная MIT , предназначенная для реализации отката сети к играм (в основном файтингам). [9]
Потенциальные причины проблем с сетевым кодом [ править ]
Задержка [ править ]
Задержки неизбежны в онлайн-играх, и качество игрового опыта строго связано с этим (чем больше задержка между игроками, тем сильнее ощущение, что игра не реагирует на их действия). [1] Задержка сети игроков (которая в значительной степени находится вне контроля игры) — не единственный рассматриваемый фактор, но также задержка, присущая способу запуска игровых симуляций. Существует несколько методов компенсации задержки, используемых для маскировки или устранения задержки (особенно при высоких значениях задержки). [10]
Тиковая ставка [ править ]
Одно обновление игровой симуляции называется тиком. Скорость, с которой выполняется моделирование на сервере, часто называют тикрейтом сервера; клиента По сути, это серверный эквивалент частоты кадров , без какой-либо системы рендеринга. [11] Тикерт ограничен продолжительностью времени, необходимого для запуска моделирования, и часто намеренно ограничивается дополнительно, чтобы уменьшить нестабильность, вызванную колебаниями тикрейта, а также снизить затраты на процессор и передачу данных. Более низкий тикрейт увеличивает задержку при синхронизации игровой симуляции между сервером и клиентами. [12] Тикрейт для таких игр, как шутеры от первого лица, часто составляет от 128 тиков в секунду (как в случае с Valorant ) , 64 тиков в секунду (в таких играх, как Counter-Strike: Global Offensive и Overwatch ), 30 тиков в секунду (как в Fortnite). и Battlefield V ) консольное издание [13] и 20 тактов в секунду (такие спорные случаи с Call of Duty: Modern Warfare , Call of Duty: Warzone и Apex Legends ). [14] [15] Более низкий тикрейт также естественным образом снижает точность моделирования. [11] что само по себе может вызвать проблемы, если зайти слишком далеко или если моделирование клиента и сервера выполняется со значительно разной скоростью.
Из-за ограничений в объеме доступной полосы пропускания и времени процессора, затрачиваемого на сетевое соединение, в некоторых играх приоритет отдается определенным жизненно важным коммуникациям, ограничивая при этом частоту и приоритет менее важной информации. Как и в случае с тикрейтом, это эффективно увеличивает задержку синхронизации. Игровые движки могут ограничивать количество отправок обновлений (симуляции) конкретному клиенту и/или конкретным объектам в игровом мире, а также снижать точность некоторых значений, отправляемых по сети, чтобы помочь с использованием полосы пропускания. В некоторых случаях эта неточность может быть заметной. [11] [16]
Программные ошибки [ править ]
Различные ошибки синхронизации моделирования между машинами также могут подпадать под категорию «проблем с сетевым кодом». К ним могут относиться ошибки, из-за которых симуляция на одной машине протекает иначе, чем на другой, или из-за которых некоторые вещи не передаются, когда пользователь считает, что так должно быть. [2] Традиционно в стратегических играх в реальном времени (таких как Age of Empires ) используются с фиксированным протоколом одноранговые сетевые модели , где предполагается, что симуляция будет работать одинаково на всех клиентах; Однако если один клиент по какой-либо причине выходит из строя, десинхронизация может усугубиться и оказаться необратимой. [11] [17]
Протокол транспортного уровня и код связи: и TCP UDP
Выбор в игре протокола транспортного уровня (а также его управление и кодирование) также может повлиять на предполагаемые сетевые проблемы.
Если игра использует протокол управления передачей (TCP), задержка между игроками будет увеличена. Этот протокол основан на соединении двух машин, в котором они могут обмениваться данными и читать их. Эти типы соединений очень надежны, стабильны, упорядочены и просты в реализации и используются практически во всех операциях, выполняемых в Интернете (от просмотра веб-страниц до отправки электронной почты или общения в чате через IRC ). Эти соединения, однако, не совсем подходят для скоростей сети, которые требуются для быстрых игр, поскольку этот тип протокола ( протоколы потоковой передачи в реальном времени ) автоматически группирует данные в пакеты (которые не будут отправляться до тех пор, пока не будет достигнут определенный объем информации). , если только этот алгоритм — алгоритм Нэгла — не отключен), который будет отправлен через соединение, установленное между машинами, а не напрямую (жертвуя скоростью ради безопасности). Этот тип протокола также имеет тенденцию реагировать очень медленно всякий раз, когда они теряют пакет, или когда пакеты поступают в неправильном порядке или дублируются, что может быть очень вредно для онлайн-игры в реальном времени (этот протокол не был разработан для этого типа программного обеспечения). ).
Если вместо этого игра использует протокол пользовательских дейтаграмм (UDP), соединение между машинами будет очень быстрым, поскольку вместо установления соединения между ними данные будут отправляться и получаться напрямую. Этот протокол намного проще предыдущего, но ему не хватает надежности и стабильности, и он требует реализации собственного кода для выполнения необходимых функций для связи между машинами, которые обрабатываются TCP (например, разделение данных по пакетам, автоматическое обнаружение потери пакетов). , и т. д.); это увеличивает сложность движка и само по себе может привести к проблемам. [18]
См. также [ править ]
Ссылки [ править ]
- ^ Jump up to: Перейти обратно: а б с д Хюинь, Мартин; Валарино, Фернандо (2019). Анализ моделей непрерывной согласованности в одноранговых файтингах в реальном времени .
- ^ Jump up to: Перейти обратно: а б «Адресация «сетевого кода» в Battlefield 4» . EA Digital Illusions CE . Март 2014 года . Проверено 30 марта 2014 г.
- ^ «Сетевой код [p1]: Борьба слов» . ki.infil.net . Проверено 7 декабря 2020 г.
- ^ Персонал, Арс (18 октября 2019 г.). «Объясняем, как в файтингах используется сетевой код на основе задержки и отката» . Арс Техника . Проверено 7 декабря 2020 г.
- ^ Пиннакл. «Разница между LAN и онлайн-киберспортом» . Пиннакл . Проверено 1 декабря 2020 г.
- ^ Ли, Джеральд (08 апреля 2020 г.). Анализ: почему сетевой код отката лучше (Youtube).
- ^ Хиллз, Дакота «DarkHorse» (29 апреля 2020 г.). «Skullgirls получает улучшенное обновление сетевого кода, изначально созданное фанатом игры» . Центры событий . Проверено 11 декабря 2020 г.
- ^ Хиллз, Дакота «DarkHorse» (10 декабря 2020 г.). «Эра сетевого кода на основе задержки может окончательно закончиться в файтингах, в зависимости от того, что SNK сделает с The King of Fighters 15» . Центры событий . Проверено 10 декабря 2020 г.
- ^ Пуш, Рики (18 октября 2019 г.). «Объясняем, как в файтингах используется сетевой код на основе задержки и отката» . Арс Техника . Проверено 14 декабря 2020 г.
- ^ «Методы компенсации задержки при разработке и оптимизации клиент-серверных внутриигровых протоколов» . Сообщество разработчиков Valve . Проверено 11 декабря 2020 г.
- ^ Jump up to: Перейти обратно: а б с д «Исходная многопользовательская сеть» . Клапан . Проверено 30 марта 2014 г.
- ^ «Падение титанов, важность хорошего тикрейта» . gamekult.com. 29 марта 2014 г. Проверено 30 марта 2014 г.
- ^ «Объявлена частота тиков на сервере Battlefield V и почему это важно» . www.glitched.online . Проверено 05 декабря 2020 г. [ постоянная мертвая ссылка ]
- ^ Дэвисон, Итан. «Сверхбыстрые серверы Valorant привлекают толпы стримеров и профессионалов. Вот почему» . Вашингтон Пост . ISSN 0190-8286 . Проверено 05 декабря 2020 г.
- ^ «Насколько плох сетевой код Apex Legends по сравнению с Fortnite и PUBG?» . Дексерто . 2019-11-23 . Проверено 05 декабря 2020 г.
- ^ «Нереальная сетевая архитектура» . Эпические игры . Проверено 7 сентября 2014 г.
- ^ Гленн Фидлер (24 февраля 2010 г.). «Что каждый программист должен знать о сетевых играх» . Проверено 8 сентября 2014 г.
- ^ Фидлер, Гленн (1 октября 2008 г.). «UDP против TCP» . Гаффер об играх . Проверено 14 декабря 2020 г.