Как работает Apex: глубокое погружение разработчика в тему серверов и сетевого кода
Ricklesauceur, ведущий инженер Apex Legends, изучает сетевые проблемы, причины их возникновения и принимаемые нами меры по их устранению.

Введение
Привет, я @ricklesauceur, ведущий инженер Apex Legends, и сегодня я хочу немного познакомить вас с сетевой инфраструктурой, обеспечивающей работу Apex Legends.
Прежде мы не часто говорили открыто о серверах, сетевом коде и сетевой инфраструктуре Apex Legends, но сегодня мы хотим все изменить. Если вкратце, то сегодня мы планируем:
- рассказать немного о том, как мы работаем над улучшением вашего опыта сетевой игры в Apex Legends;
- признать и объяснить некоторые распространенные сетевые проблемы или проблемы с подключением, с которыми вы можете столкнуться при игре в Apex;
- ответить прямо на частые вопросы, связанные с такими темами, как серверы с замедленным откликом, определением попаданий и работой нашей системы компенсации задержек;
- дать исчерпывающие комментарии о тактовой частоте наших серверов и объяснить наши мысли по поводу того, на что она влияет, а на что нет.
Внимание! Это длинная статья, потому что предполагает по-настоящему глубокое погружение в сетевую инфраструктуру Apex Legends, о чем некоторые игроки, как мы видели, просили уже давно.
Мы думаем об этом, как о начале более длинного разговора. И хотя мы затронем сегодня многие аспекты, существует целый ряд тем (DDOS-атаки, ошибки, вызывающие сбой серверов и т. д.), на обсуждение которых мы хотели бы уделить время. В общем, если вам понравится этот блог, дайте нам знать, о чем бы вы хотели услышать в следующий раз, а мы продолжим.
Мы рады всем, кто готов слушать скучные рассуждения о сетевом коде, серверах, тактовой частоте и многом другом... Добро пожаловать! И начнем мы с разговора о недавних улучшениях, которые мы ввели.
УСКОРЕНИЕ НАШЕГО РЕАГИРОВАНИЯ С ПОМОЩЬЮ КОНТРОЛЯ ПОКАЗАТЕЛЕЙ ПРОИЗВОДИТЕЛЬНОСТИ
В сезоне 6 мы представили функцию показателей производительности. Выглядит это следующим образом и дает основную информацию о вашей производительности.

«Вход» и «выход» — это пропускная способность, используемая игрой (в кбит/с). Также есть показатель задержки (в миллисекундах). Потеря входящих и исходящих пакетов представлена в виде процента пакетов в секунду.
Эти цифры помогают вам — и нам! — понять, что вы испытываете во время игры. Иными словами, мы можем перевести ваши ощущения в техническую информацию, имеющую практическую ценность.
Прежде чем мы добавили эту функцию, мы часто слышали от игроков, что «что-то» не так, но они не всегда могли рассказать нам об этом более подробно. Теперь же вы можете сказать точно: «Потеря входящих пакетов у меня составляет 10 %, а задержка — 300 мс» и т. д. Это все меняет, потому что эти значения зачастую являются лучшими из возможных индикаторов тех вещей, которые происходят не по плану. Я еще к этому вернусь.
Работая над функцией показателей производительности, мы также начали контролировать основные показатели производительности для игроков и серверов. Это означает, что если кто-то сообщает о проблемах, то мы можем детально разобрать данный матч и посмотреть данные всех игроков в нужный момент, включая информацию о конкретном сервере, на котором организован матч.
Это был первый большой шаг к предоставлению для нашей команды персонализированных и целевых средств исследования. У нас были некоторые успехи с таким подходом, но, по нашему мнению, в долгосрочной перспективе он не годится. Сначала нам нужно было получить сообщение от вас, затем отправить инженера, чтобы понять, в чем проблема, и лишь потом (в зависимости от проблемы) попытаться ее исправить.
В последние несколько сезонов мы начали пользоваться помощью нашей замечательной команды обработки и анализа данных, чтобы собирать и анализировать данные за одну неделю с целью определения чрезмерной потери пакетов и проблем с производительностью серверов. Такой подход уже приносит свои плоды. Например, мы обнаружили, что одна единица сетевого оборудования в нашем центре обработки данных оказалась неисправной, из-за чего каждая игра, проходящая на нескольких серверах, имела серьезные проблемы с производительностью. С самими серверами все было в порядке, но аппаратное обеспечение, которое подключало игроков к этим серверам, приводило к массовой потере пакетов. У нас еще много подобных примеров.
Основная выгода от систематического анализа данных— это возможность сопоставления показателей и игроков для обнаружения закономерностей. Таким образом, неделя за неделей мы можем с уверенностью определить: улучшается или ухудшается состояние нашего парка серверов. Анализ данных также замечательно помогает нашим партнерам исправлять проблемы, если те не зависят от нас. Вместо того чтобы говорить, что имеется какая-то проблема, мы можем сказать: «Конкретно здесь и есть проблема», что экономит время всем участникам. (Кстати, если хотите, вы можете отказаться от использования этой функции. Перейдите в раздел «Игровой процесс» и выберите пункт «Передача сведений об использовании» в меню настроек.)
Так что автоматизация во многом помогает. Но ее недостаточно.
Даже с таким подходом мы все еще довольно медленно реагируем на проблемы. Нам приходится выжидать неделю, пока большая часть данных не будет собрана и отправлена нам, после чего полное исследование может занять еще неделю. С того момента, как вы заметили проблему, мы можем потратить до двух недель на поиск решения и еще больше времени — на применение исправления, если для этого требуется обновление сервера.
Но мы можем действовать эффективнее. И мы будем это делать. Поэтому давайте поговорим о решениях.
Во-первых, помимо еженедельного отчета, мы перешли к извещениям в режиме реального времени. Это позволит нам получать информацию на том же уровне, что и сейчас, только быстрее. Мы сможем немедленно исправлять проблемы аппаратного обеспечения или начинать исследование и работу над обновлением. Мы понимаем, что можно сильно разочароваться, когда приходится ждать, и активно стараемся сократить время между извещением о проблеме и ее исправлением.
Во-вторых, мы собираемся добавить новый уникальный идентификатор сервера (SID) к показателям производительности, что позволит нам быстрее определять сервер, на котором вы играете. В настоящий момент вы пересылаете нам время и дату, а мы сопоставляем их с имеющимися данными о вас, чтобы найти сервер, на котором вы играли. Скоро нам не придется этого делать.
Мы ожидаем, что оба вышеописанных решения будут введены в игру в предстоящем сезоне Apex Legends «Наследие». В результате игроки получат более оперативное решение проблем с серверами, иногда вдвое более быстрое, чем при нынешнем положении вещей.
ГЛУБОКОЕ ПОГРУЖЕНИЕ В РАСПРОСТРАНЕННЫЕ ПРОБЛЕМЫ
А теперь самое интересное: разобьем проблемы с серверами, с которыми вы можете столкнуться, по категориям. Приведенный внизу список не является исчерпывающим, но я надеюсь, что он ответит на большинство ваших вопросов.
Сервер работает с замедленным движением.
Говорить об этом любят все. Наши серверы работают на частоте 20 Гц. Это означает, что они моделируют состояние целого игрового мира раз в 50 мс — 1 секунда (или 1000 мс), поделенная на 20.
При обсуждении производительности серверов мы не говорим о частоте кадров в секунду (FPS), потому что на сервере не отображаются картинки. Вместо этого компьютер обрабатывает «состояния», но основополагающий принцип остается тем же. Сервер принимает команды пользователя (из сети), обрабатывает физику, отправляет данные о новом состоянии мира клиентам, а затем повторяет все это заново. Если этот процесс занимает постоянно более 50 мс, ваша игра замедляется, чтобы сервер мог завершить моделирование. Вот так и появляются серверы с замедленным движением.

Обзор времени кадра для сервера. В 5-м столбце находятся целевые 50 мс. Все, что ниже — быстрее. Вы можете видеть, что этот сервер работал стабильно и даже быстрее, чем требуется.

Если провести сравнение, то этот сервер никогда не доходил до такой величины времени кадра, в основном работая на уровне около 200 мс (что в 4 раза медленнее). В общем, типичный сервер с замедленным движением.
Причин этому может быть несколько, но иногда это связано с машинами в центре обработки данных, которые работают не так, как должны. Вспомним о замедленных процессорах, перегреве и т. д.
Если мы замечаем такие машины, то обычно их убираем. То есть мы звоним поставщику услуг, указываем на проблему с определенной машиной и просим его отключить ее.
Решение с обнаружением в режиме реального времени, упомянутое в этом блоге ранее, должно значительно сократить частоту возникновения этой проблемы, когда оно будет введено в игру в предстоящем сезоне. Мы очень заинтересованы в решении этой проблемы, поэтому будем пристально за ней следить.
Сетевая задержка у меня то увеличивается, то уменьшается.
Если вы играете через подключение Wi-Fi, мы мало что можем для вас сделать. В других же случаях быстро меняющееся время задержки иногда может быть связано с производительностью наших серверов.
И хотя мы все знаем, что игра обычно идет с частотой 60 кадров в секунду, это может измениться, когда на экране происходит много событий. Даже если частота упадет всего на несколько кадров, вы это почувствуете. Аналогичная ситуация и с серверами. Здесь автоматическое обнаружение не особо помогает определить основную причину проблемы. Когда-то мы были вынуждены воссоздавать условия замедления на сервере разработчиков, но это довольно затратно по времени и всегда немного напоминает попадание пальцем в небо, ведь ваша машина, вероятно, работает с другим аппаратным обеспечением или с другими настройками, поэтому полностью воспроизвести ситуацию сложно.
К счастью, наша операционная команда разработала инструмент, позволяющий нам получить так называемый файл RPROF. В сущности, это обзор того, что сервер совершает во время каждого кадра (моделирование баллистики, входящего и исходящего сетевого трафика, движения игроков и т. д.). Благодаря файлам RPROF мы можем узнать, что вызывает замедление, а инженер может заняться оптимизацией. Обычно проблема относится к повышению требований для производительности, появляющихся с новыми функциями из сезона в сезон.
Например, вы можете вспомнить замедление на экране чемпиона в начале игры во время сезонов 7 и 8. Причиной было то, что все игроки в матче появлялись в одном и том же месте сверху и даже перекрывали друг друга. (А вы просто не могли увидеть их из-за интерфейса!) Система моделирования физики очень не любит, когда какие-то объекты перекрываются, поэтому наш физический движок пытался убрать все тела подальше друг от друга, что приводило к масштабному возрастанию нагрузки на процессор на сервере.

Процент матчей, на которые влияет сервер с замедленной производительностью (необязательно с замедленным движением), в регионах. Вы можете видеть, что в некоторых регионах ситуация со временем улучшается, а в некоторых — ухудшается (ось X — это время).

Подробный обзор региона западной части США, позволяющий нам обнаружить неисправные машины (ось X — это время). На графиках очень четко видны сбои. Они затрагивают лишь некоторые машины, но работа других остается стабильной.
Мы ожидаем, что использование нами файлов RPROF поможет нам лучше оптимизировать новые функции, добавляемые в игру, и в целом снизить задержку в будущем. Снижение задержки для всех игроков — это приоритетная задача для нас, и более эффективные средства вроде этого крайне важны для того, чтобы мы этого добились.
У меня большая потеря входящих/исходящих пакетов.
Это крайне коварная вещь. Вероятно, вы в этом не виноваты, и мы обычно тоже!
Тут все связано с тем, как интернет-трафик передается с вашего компьютера в наш центр обработки данных и обратно вам. В самом начале ваш сетевой трафик проходит через сеть вашего интернет-провайдера. У вашего интернет-провайдера могла случиться авария, из-за чего ваша — и не только ваша — информация была утеряна. В результате игровой клиент не понял, что происходит с ближайшими к вам игроками, а сервер игры не получил сведений о том, что вы хотите выстрелить или переместиться в определенном направлении. Есть также связь между сетью вашего провайдера и сетью нашего центра обработки данных. Проблемы могут возникнуть в любой точке этого маршрута.
Когда все идет гладко, мы называем этот процесс «пиринг». Зачастую проблемы с пирингом имеют место в случае слабой связи между двумя сетями. А ведь может быть несколько таких переходов. И конечно же, вся информация от серверов Apex должна попасть обратно к вам, часто по другому маршруту. Сейчас вы начнете понимать, почему это сложный процесс.
Если мы хотим решить данную проблему, в первую очередь нам нужно определить, где произошел сбой. Это трудно выполнить автоматически, потому что нам нужны данные от вас и данные от сервера, чтобы взглянуть на проблему с двух точек зрения и попытаться проверить весь маршрут для обнаружения места возникновения проблемы.
На данный момент мы просим игроков предоставить нам какие-либо данные трассировки сети и делаем то же самое с нашей стороны в центре обработки данных, чтобы попытаться обнаружить точку перегрузки. Это крайне затратно по времени и решается медленно, потому что в зависимости от полученных нами сведений нам приходится вести переговоры с различными деловыми партнерами по всему миру. Мы надеемся, что автоматизация поможет улучшить этот процесс, и, кроме того, мы работаем еще над некоторыми улучшениями, которые пока еще находятся в зачаточном состоянии.
Когда речь идет о проблемах с сетевых трафиком вроде тех, что мы сейчас обсуждаем, то к хорошим новостям можно отнести то, что осложнения возникают массово, а не связаны с какой-то отдельной личностью. Это означает, что исправление проблемы у одного игрока обычно помогает и множеству других. Также мы активно снижаем пропускную способность, расходуемую игрой, что помогает устранить проблему.
Хосты | Лучшее | Средний показатель | Худший показатель |
---|---|---|---|
Местный провайдер | 22 | 31 | 264 |
Провайдер 1 | 27 | 185 | 515 |
Провайдер 2 | 24 | 194 | 652 |
Сервер игры | 31 | 263 | 522 |
Это данные трассировки сети (с демонстрацией задержки) от одного из наших профессиональных игроков, поступившие от его роутера на один из наших серверов. Мы выполняем проверку несколько раз, чтобы определить состояние интернет-подключения. Вы видите, что лучший показатель для его игры — это задержка 31 мс. Однако худший — это около 522 мс. В этом случае игровой опыт крайне ухудшается, потому что подключение колеблется с разницей в 500 мс. Связь в сети его локального провайдера немного нестабильна, но, судя по среднему показателю, происходит это довольно редко (среднее значение — 31 мс, а худшее значение — 264 мс. Возможно, это был единичный случай). Однако далее мы видим возрастание задержки между локальным провайдером и провайдером 1, который является одним из узлов между игроком и нашим сервером игры. Так что мы можем быть вполне уверены в наличии потери пакетов и проблем маршрутизации между этими точками. От нас это не зависит, но мы можем проинформировать этих партнеров о проблеме. Обычно в интересах каждого решить такую ситуацию.
Меня убивают, когда я нахожусь за дверью или стеной, а иногда я возвращаюсь в прежнее положение.
Это сложная тема. Здесь все связано с компенсацией задержек.
В каждой игре еще со времен зарождения сетевых игр главной проблемой разработчиков была имитация действий в режиме реального времени в среде, которая не работает в реальном времени. В сущности, все, что вы делаете в сетевых играх, имеет задержку при передаче данных на сервер и обратно. Этому способствует множество других факторов: ввод команд, отрисовка графики и да, даже тактовая частота серверов.
Более того, ваш противник почти наверняка играет при другом уровне задержки. Для решения этой проблемы наши серверы должны постоянно следить не только за тем, что происходит в данный момент у вас и вашего противника, но и за тем, что происходило с точки зрения вас обоих, когда вы оба вводили команды для своих действий. Компенсация задержек — это искусство соединения слегка различных впечатлений в одну общую реальность.
Для этого нет идеального решения. Нет единой истины. В итоге сервер превращается в подобие машины времени. Он постоянно откатывает состояние игрового мира назад, чтобы посмотреть, не попал ли ваш выстрел в кого-нибудь, а затем соответствующим образом обновляет мир для всех.
Чтобы лучше проиллюстрировать этот принцип, мой коллега Эрл Хаммон написал небольшую статью об объективности и компенсации задержек и о том, как это работает в Apex Legends. Ниже я ее и процитирую:
Давайте рассмотрим различные сценарии с двумя игроками в Apex Legends, которых назовем HIGH и LOW. У HIGH будет высокий пинг в 300мс, а у LOW — низкий, в 50 мс. Разница в величине пинга — 250 мс.
Что будет, если они выстрелят друг в друга в один и тот же момент реального времени? Скажем так, выстрел LOW будет обработан на сервере задолго до выстрела HIGH, так что у LOW будет преимущество.
Что будет, если один из них перемещается за угол и при этом они внезапно замечают друг друга? И в этом случае у LOW есть преимущество. LOW меньше «застревает в прошлом», поэтому заметит HIGH первым. И снова у LOW преимущество — за счет пинга. Это складывается с тем, что выстрелы LOW доходят до сервера раньше.
Все эти случаи «несправедливы» в том смысле, что у LOW в принципе есть преимущество, но «справедливы» в другом: предполагать, что игрок с низким пингом получит преимущество в данной ситуации, вполне разумно.
Но что происходит, когда LOW заходит за угол, чтобы оказаться в укрытии? Что ж, HIGH еще находится «в прошлом», для него LOW еще не оказался в укрытии, поэтому HIGH может стрелять по нему до этого момента, но LOW не узнает об этом до тех пор, пока пакеты данных от HIGH не доберутся до сервера, а затем — к нему. К этому времени LOW видит, что находится в укрытии, но по нему все еще попадают. С точки зрения игрока LOW, это нонсенс.
Однако, это симметричный ответ на ранее рассмотренную нами абсурдную ситуацию, которая работала в пользу игрока LOW! Когда LOW выскакивает из укрытия, чтобы атаковать HIGH, первый заметит второго и начнет стрелять гораздо раньше, чем HIGH «увидит», что LOW уже не в укрытии. С точки зрения HIGH это тоже нонсенс, что его подстрелил кто-то находящийся в укрытии. Этот абсурд невозможно искоренить, и он будет преследовать тех или иных игроков благодаря простому факту, что «пинг» существует как реалия и у разных игроков он различается.
Некоторые посчитают несправедливым то, что по LOW может стрелять и попадать игрок HIGH, когда первый считает, что находится в укрытии. Альтернатива, по их мнению, состоит в том, что требуется корректировка именно высокого пинга у игрока HIGH. Для этого нам потребуется внедрение неравновесного и асимметричного способа обработки сетевых задержек.
Не очень приятно, что из-за плохого пинга тебя подстреливают, когда ты считаешь, что ты в укрытии, как это может быть у игрока LOW. И также не очень приятно, что из-за плохого пинга тебя может подстрелить кто-то, кого ты даже еще не увидел, как это может быть у игрока HIGH. Данная абсурдная ситуация распределяется симметрично.
Мы хотим окончательно прояснить: не все онлайн-игры работают так, как Apex. Некоторые игры всегда дают преимущество игрокам с низким пингом, но в нашей системе мы решили этого избежать. Мы намеренно выбрали данную позицию, рассмотрев все компромиссы и поразмыслив о справедливости в сетевых соревнованиях.
Если описать нашу систему в двух словах, то игроки с низким пингом не всегда получают преимущество над игроками с высоким, а иногда и просто наблюдают «нонсенс» (для нас это технический термин).
Это тот элемент компромисса, который мы намеренно внесли в нашу систему. Но есть и положительный момент: вы можете играть в Apex Legends и играть относительно хорошо, даже если у вас выше средней величина сетевой задержки, что очень важно как для негородских игроков, так и для игроков в регионах, где подключение нестабильно. Мы считаем, что «нонсенс» необходимо искоренять при первой возможности, но в условиях, далеких от идеальных, это нужно делать в адекватной и справедливой для всех игроков манере.
Вот поэтому почти всегда, когда вы наблюдаете какой-то нонсенс, например в вас попали, когда вы находитесь за стеной или как раз заходили за угол, скорее всего, это вызвано неизбежной разницей в сетевых задержках у игроков и тем, как их обрабатывает наша система. Тем не менее мы намерены улучшать этот аспект при каждой возможности. Мы хотим, чтобы для всех вас игра была не только честной, но и приносила удовольствие.
Некоторые мои выстрелы игра не обрабатывает.
Давайте обсудим обработку попаданий. «Безрег», или «отсутствие регистрации выстрела», происходит, когда вы считаете, что попали в цель, но сервер в целом с этим не согласен. С вашей точки зрения, были все внешние проявления в виде брызг крови и звуков, но счетчик нанесенного урона не появился. В таких шутерах, как Apex Legends, это крайне неприятно.
Это может случиться по множеству причин. Иногда высокая задержка или потеря пакетов могут привести к тому, что ваша локальная симуляция рассинхронизирована с сервером. Вы стреляли туда, где видели кого-то, но на самом деле вы стреляете туда, где они были раньше. К сожалению, вы этого не узнаете, пока ваша «копия» мира не «догонит» сервер.
Иногда это просто ошибка в обработке физики. Чтобы вы могли сразу же получить обратную связь, мы в основном полагаемся на концепцию, которая называется прогнозированием. После выстрела, зная баллистические характеристики оружия, мы можем предсказать локально, куда попадет пуля, без необходимости в обработке со стороны сервера. Так игра выглядит более отзывчивой.
Обычно клиент и сервер не противоречат друг другу и пуля летит согласно спрогнозированной траектории. Ранее при обсчете баллистики и траектории пуль присутствовали ошибки (для всего оружия с размером пули, отличным от точки, например для снайперских винтовок). Такие ошибки нелегко обнаружить, поэтому мы внедрили в игровые тесты некоторые визуальные эффекты для быстрого выявления проблемы. К сожалению, данный диагностический код слишком «тяжел» для онлайн-игры (из-за ограничений пропускной способности), поэтому мы можем применять его только при внутреннем тестировании.

Каждый раз, когда происходит «безрег», мы прорисовываем хитбокс и траекторию пули (справедливости ради, траектория должна слегка искривляться, ну да ладно!). Это наглядно помогает нам записать, что произошло, а затем проанализировать все согласно журналам на сервере.
Прогресс в решении проблемы достигается двумя способами.
Первый заключается в постоянном и тщательном изучении различных ошибок, которые приводят к неправильному определению попаданий. Мы также разрабатываем инструменты для автоматизации процессов, чтобы помочь разработчикам избежать новых ошибок. И мы будем постоянно и неотрывно над этим работать.
А второй — это взаимодействие с вами! Когда игроки отправляют нам ролики с записанными фактами отсутствия регистрации попаданий, это помогает нам понять, в чем состоит ошибка, требующая нашего внимания. Зачастую выясняется, что в роликах зафиксированы проблемы задержки, а не регистрации попаданий, поэтому, пожалуйста, сверьтесь с вашими показателями производительности перед тем, как сообщить о проблеме с попаданиями. Однако, как упоминалось выше, ваши обращения уже помогли нам найти и исправить некоторые ошибки в игре, так что ваши отчеты помогают сделать игру лучше для всех. Заранее благодарим вас!
А что насчет ошибок, которые не дают мне войти в систему, например «code:net»?
code:net — это общее сообщение об ошибке, которое отображается при истечении времени соединения с сервером. Это может быть вызвано разнообразными проблемами — как с нашей, так и с вашей стороны. По правде говоря, мы обнаружили, что некоторые из самых серьезных ошибок code:net (и связанных с ними, таких как code:leaf и т. д.) могут быть связаны с поддерживающими работоспособность игры сервисами Respawn. А значит, нам нужно провести отдельное расследование.
Мы предприняли ряд шагов, чтобы снизить вероятность возникновения ошибки code:net, и многие игроки смогут решить проблему, связавшись с нашей службой поддержки. Если вы не можете войти в учетную запись и получаете сообщение об ошибке code:net или схожее, пожалуйста, сообщите о нем на сайте EA help.
Поскольку code:net — это общее сообщение, оно может ссылаться на ряд различных проблем. За последние несколько недель нам удалось решить некоторые из них, но мы знаем, что нам еще есть над чем поработать. Сообщайте нам о проблемах, и мы постараемся устранить их как можно быстрее. Поверьте, нас эта проблема раздражает так же, как и вас.
ТАКТОВАЯ ЧАСТОТА СЕРВЕРА
А вот и гвоздь программы. И мы хотим осветить данный вопрос со всей ясностью. Многие игроки спрашивали о тактовой частоте нашего сервера и почему бы нам просто не увеличить ее с 20 Гц, как это сделали в других сетевых шутерах.
Мы объясняли, как тактовая частота влияет на общую частоту обновления изображения на вашем экране, так что вопрос вполне понятен. Однако сопоставлять тактовые частоты разных игр не такая уж и простая задача, как может показаться на первый взгляд.. Мы постараемся объяснить почему.
Тактовая частота сервера — это количество симуляций, которое сервер выполняет в секунду. Это фиксированное число (см. раздел о замедленном движении). Apex использует модель тиражирования на основе моментальных снимков. Главным образом это означает, что в конце каждого такта сервер записывает текущее состояние мира и воспроизводит эту информацию для каждого клиентского соединения. Она содержит огромный массив данных, который обеспечивает высочайшее качество отображения оружия, карты и внешнего вида Легенд.
Чтобы добиться успеха в Apex Legends, вам нужно внимательно следить за информацией о происходящем на всей карте. Использованные тактические способности, активированные пассивные способности, доступные спецумения, сброшенные припасы или прибытие нового отряда, попавшего в радиус действия дрона Крипто. Мы хотим, чтобы от игроков ничто не ускользнуло. А наши дизайнеры способны создавать игрушки и инструменты, которые могут быть по-настоящему глобальными. Многие игры не вычисляют полное состояние игрового мира на каждом такте, что делает некорректным сравнение одной игры с другой, основываясь лишь на обособленных значениях вроде «20 Гц» или «30 Гц».
Вопрос же состоит в том, что именно происходит во время каждого такта? Мы хотим, чтобы состояние мира было максимально точным, поэтому наши серверы сохраняют полное состояние мира на каждом такте. Не делая этого, мы бы наверняка снизили затраты процессорного времени на наших серверах, но пострадала бы точность наших симуляций, а этим мы не готовы пожертвовать.
Выражаясь проще: чем выше тактовая частота, тем выше трафик, отправляемый всем игрокам. Если на сервере мы переключаемся с 20 Гц до 60 Гц, объем трафика, используемого игрой, возрастает втрое. В настоящее время Apex Legends в начале игры нужно примерно 60 кбит/с. Сервер с 60 Гц потребует пропускной способности в 180 кбит/с. Кажется, что это не очень много, но на самом деле это не так, и мы постоянно ищем способы снижения требований к пропускной способности.
Но что произойдет, если пропускная способность немного увеличится? Для игр снижение объемов трафика гораздо важнее, чем, скажем, для видеостримов. В приложениях с высоким трафиком (трансляции, загрузки и т. д.) рывки и зависания легко скрыть буферизацией передачи, снижением качества изображения и т. д. Скорее всего, в уже загруженном видео вы не увидите рывков, да и то, что скорость отличается на несколько, а то и сотни миллисекунд, вас мало заботит.
Играм такая роскошь недоступна. Пропуск хотя бы пары интервалов в 50 мс может привести к проблемам. Пропуск еще нескольких может загнать вас в «порочный круг» получения все больших пакетов данных для синхронизации. Эти обновления нельзя не получать, потому что для клиентской части требуется точное состояние игрового мира.
Пример, приведенный выше, демонстрирует, что сравнивать тактовые частоты разных игр сложно, поскольку информация, содержащаяся в тактах, у них различна. Есть и другое препятствие: ограничения на ввод и отправку данных у серверов не всегда одинаковы, даже если у них одна и та же тактовая частота. Например, во многих играх, если сервер работает на 60 Гц, это означает, что клиент может отправлять только 60 Гц данных. Если ваш клиент работает на частоте 60 кадров в секунду, то все в порядке, но при частоте в 120 кадров в секунду, вы будете терять половину данных. В Apex Legends такого не будет. Мы успешно обрабатываем входные данные различного объема. (Следует отметить, что чем выше частота кадров в секунду в Apex, тем больший объем трафика потребляется.)
Итак, мы обсудили некоторые минусы, которые могут проявиться с увеличением тактовой частоты на сервере. Но что насчет плюсов перехода, скажем, с 20 Гц до 60 Гц? Ну же, Respawn! Разве это не сделает серверы в три раза быстрее и втрое производительнее? Просто сделай это!
Наши исследования показали, что это не приведет к существенным изменениям, и сейчас мы объясним почему.
Чисто теоретически предположим, что ваш средний пинг или задержка — около 50 мс. Помним, что ваш пинг — это скорость путешествия данных от вашего компьютера до сервера и обратно. Предположив, что нет других проблем вроде плавающей сетевой задержки или аппаратного отставания (например, дисплеи, дающие задержку в 20–50 мс) после нажатия вами кнопки или щелчка мышью сервер получит данные через 25 мс (половина пинга).
Так как наши серверы работают на частоте 20 Гц, они обновляют состояние мира каждые 50 мс (1000 мс в секунду / 20 тактов в секунду = 50 мс за каждый такт). Поэтому в худшем случае ваши данные будут обработаны сервером через 75 мс (25 + 50 мс).
Чтобы понять, как именно задержка в 75 мс скажется на вашем восприятии игры, подумаем о частоте кадров. Математика здесь может быть сложной, но давайте вспомним, что в игре с частотой 60 кадров в секунду каждый кадр занимает 16,67 мс (1000 мс в секунду / 60 кадров в секунду = 16,67 мс за кадр). Если ваши данные сервер обрабатывает через 75 мс, как в нашем примере выше, и ваша игра работает с частотой 60 кадров в секунду, это означает, что задержка между вашим действием и его воздействием на игру составит примерно пять кадров (75 мс для каждого обновления / 16,67 мс на кадр = около 4,5 кадров и округляем до 5 кадров, так как не существует такой вещи, как половина кадра).
Если проделать все вышеприведенные расчеты для сервера с частотой 60 Гц, то вы получите 41,67 мс максимальной задержки между вводом данных и их обработкой сервером (25 мс пинга + [1000 мс / 60 тактов в секунду = 16,67 мс за такт] = 41,67 мс).
41,67 мс определенно лучше, чем 75 мс, но как это отразится на частоте кадров? Давайте снова предположим, что мы работаем на частоте 60 кадров в секунду. На каждый кадр требуется 16,67 мс, поэтому теперь задержка между вашими данными и обработкой их сервером составляет примерно три кадра (41,67 мс за каждое обновление / 16,67 мс на кадр = около 2,5 кадров, округление до 3 кадров, так как все еще не существует такой вещи, как половина кадра).
Сопоставляем все вычисления и получаем, что серверы на частоте 20 Гц работают с задержкой примерно в пять кадров, а серверы с частотой 60 Гц — с задержкой в три кадра. То есть при втрое больших затратах трафика и процессорного времени, вы снижаете задержку на эквивалент двух кадров в лучшемслучае. Плюсы есть, но они не масштабны и не помогут в случае проблем, связанных с обычной задержкой (вроде получения ранения в укрытии), проблем на уровне провайдера или из-за ошибок (например, отсутствие регистрации попадания и замедление серверов).
В нашем примере рассмотрены плюсы перехода с 20 Гц на 60 Гц. Вы можете использовать ту же математику для расчета других случаев, например изменения с 20 Гц до 30 Гц или даже 40 Гц, и вы увидите, что прирост в частоте кадров будет таким же небольшим. Тактовая частота потребует серьезного увеличения, чтобы ощутить изменения: даже переход с 20 Гц на 60 Гц будет ощущаться, как разница между 58 и 60 кадрами в секунду. Разница есть, но мы искренне верим, что она недостаточна, чтобы в первую очередь заниматься увеличением тактовой частоты, а не другими, более эффективными улучшениями, которые мы могли бы привнести в игру.
ЗАКЛЮЧЕНИЕ
В заключение хотим высказать свои мысли о том настоящем и искреннем разочаровании, которое игроки испытывают при проблемах с онлайн-играми. Когда приходится иметь дело с задержками, «безрегами» или медленными серверами, это отстой. Это выбивает вас из колеи и может сильно демотивировать, когда вы пытаетесь достичь нового ранга, отыграть несколько отличных матчей с друзьями или просто расслабиться вечерком.
Одна из сложностей обсуждения сетевых проблем заключается в том, что, когда мы рассказываем о нашей системе или нашей позиции касательно таких проблем, как корректировка задержек или тактовая частота, это может начать раздражать игроков, которые просто хотят, чтобы игра была лучше. Если у вас возникают проблемы с задержками, сбоями сервера, порчей учетной записи или любые другие сложности, с которыми вы можете столкнуться во время игры в Apex Legends, вам вряд ли захочется слышать о чем-то, чего мы не делаем.
В конечном итоге мы просто хотим сделать игру лучше. Чем лучше ваши впечатления от онлайн-игры, тем больше в нее будут играть другие, что позволяет нам и дальше заниматься тем, что мы любим.
Именно поэтому мы делимся в этом блоге несколькими улучшениями, которые собираемся внедрить в ближайшем будущем, в том числе следующими.
- Оповещение в режиме реального времени, что позволит нам быстрее выявлять проблемы и реагировать на них.
- Инструменты для идентификации серверов, нужные для быстрого удаления и замены проблемных серверов.
- Концентрация внимания на наличии медленных серверов: удаление проблемных серверов — это лишь один шаг, но наша конечная цель — существенно сократить их количество за счет изменения кода игры.
- Снижение задержек и глубокая оптимизация новых функций.
- Исправление существующих ошибок с определением попаданий и создание автоматизированных инструментов обнаружения, которые помогут нам избежать появления новых проблем.
Но мы хотим, чтобы вы знали, что мы делаем не только это. Мы работаем с нашими партнерами — начиная от поставщиков серверов и до провайдеров — над улучшением и инвестированием в нашу онлайн-инфраструктуру и стремимся к тому, чтобы игроки сообщали о все меньшем количестве проблем и лучшем качестве восприятия. Мы подробно осветим эти шаги в будущих публикациях, когда увидим, что наши усилия приносят плоды.
Мы надеемся, что, если мы начнем сообщать вам больше о проблемах, которые нас волнуют, мы будем говорить на одном языке об основных причинах проблем, с которыми мы имеем дело. Для этого мы и написали эту статью. Надеемся, она поможет понять ход наших мыслей и разобраться в технических особенностях управления онлайн-шутером. И мы очень рассчитываем на то, что это не последний наш разговор.
Спасибо, что прочитали!
— Сэми (Ricklesauceur) и команда Apex Legends
Играйте в Apex Legends бесплатно* на PlayStation 4, PlayStation 5, Xbox One, Xbox Series X|S, Nintendo Switch и ПК через Origin и Steam.
Следите за Apex Legends в Twitter и Instagram, подпишитесь на наш канал на YouTube и загляните на наши форумы.
Подпишитесь на новостную рассылку, чтобы получать последние новости об Apex Legends, закулисный контент, эксклюзивные предложения и многое другое (включая прочие новости EA, информацию о продуктах, событиях и акциях) по электронной почте.
Описанные в данной статье возможности в будущем могут претерпеть изменения, поскольку мы прислушиваемся к отзывам игрового сообщества и продолжаем работать над сетевым сервисом и наполнением игры, постоянно развивая их. При этом мы всегда будем прилагать усилия для того, чтобы сделать этот процесс максимально открытым для игроков. Более подробную информацию можно получить на странице уведомлений о предоставлении сетевых услуг EA: https://www.ea.com/ru-ru/service-updates.
* Может потребоваться учетная запись на соответствующей платформе и подписка платформы (продается отдельно). Требуется постоянное подключение к Интернету и учетная запись EA. Действуют возрастные ограничения. Включает в себя возможность совершать внутриигровые покупки.
