Разработчики: «Наша главная цель — постоянно держать тикрейт сервера на уровне 30 Гц»

Сегодня разработчики опубликовали содержательный, полный технических деталей блог, в котором рассказали сообществу о прогрессе, которого им удалось добиться в вопросах оптимизации серверной части PlayerUnknown’s Battlegrounds. Так, производительность серверов увеличилась в среднем на 20% после выхода обновления #19. Кроме того, значительно (на 50%) сократилась сетевая задержка, в результате чего проблем с рассинхронизацией стало меньше.

Уважаемые игроки,

В сегодняшнем блоге разработчиков мы хотели бы поделиться некоторыми достижениями, которых достигли в вопросах улучшения производительности сервера. Кроме того, мы расскажем о новых улучшениях, над которыми мы сейчас работаем.

Краткое описание

Версия Unreal Engine, используемая в настоящее время PUBG, основана на модели Клиент-Сервер, и поэтому статус каждого актора (объекты, размещенные на уровнях, и представляющие собой персонажей, здания, фоны, камеры и т. д.), должен обновляться посредством сервера для каждого игрока.

Производительность сервера обычно рассчитывается по “тикрейту” сервера или частоте кадров. По мере увеличения производительности сервера время на кадр будет уменьшаться. Поскольку время на кадр уменьшается, время ответа сервера также улучшается.

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

Улучшения в обновлении #14

Структура сетевого процесса до обновления #14 и ее ключевые моменты

Перед обновлением #14 сеть работала на сервере Unreal Engine так, как показано ниже:

Для начала объясним вышеописанный поток сетевых процессов. На этапе «Net Dispatch» пакет, полученный от клиента, обрабатывается на сервере. Например, у нас есть входящая информация, такая как стрельба, передвижение и прочее. Показатели, которые обрабатываются во время этого этапа, обычно распространяются по другим клиентам в двух формах: RPC (удаленные вызовы процедур) и репликация. После этого игровая логика, такая как физическое моделирование, обрабатывается на этапе «Simulate & Render», и результат доставляется всем клиентам через этап «Net Flush».

Однако, когда RPC отправляются в результате процесса «Net Dispatch», они не отправляются немедленно, а ставятся в очередь в буфере. Многие вещи, хранящиеся в буфере, отправляются всем клиентам во время этапа «Net Flush», и буфер затем очищается.

В этой структуре RPC должен пройти этап «Simulate & Render», чтобы попасть из «Net Dispatch» в «Net Flush» а это, в свою очередь, приводит к задержке. Вероятно, Unreal Engine был запрограммирован таким образом для того ,чтобы уменьшить количество пакетов, отправленных в UDP. Когда количество пакетов сокращается, сеть работает более эффективно.

Новая структура и усовершенствования сетевого процесса

Мы решили, что улучшение времени отклика сервера более важно, чем уменьшение количества пакетов для PUBG. Поэтому, в обновлении #14 мы переработали структуру, как показано ниже. Мы добавили еще один этап «Net Send Flush» до этапа «Simulate & Render».

На этапе «Net Send Flush» все данные UDP, хранящиеся в буфере, рассылаются, а буфер очищается. Благодаря этому нововведению, время уходившее на этап «Simulate & Render» больше не затрачивается, что уменьшает время задержки. Во время фазы «Net Send Flush» не производится обширных вычислений для репликации актора и данные UDP, ожидающие рассылки быстрее уходят.

Поскольку в новой структуре появилось два сетевых обновления: «Net Send Flush» и «Net Flush», скорость обновления сети удвоилась после обновления №14, из-за чего некоторые люди предположили, что скорость обращения к серверу, также известная как «тикрейт» - увеличилась. Тем не менее, связано это было не с «тикрейтом», а со скоростью обновления сети, которая поднялась до 60 тиков, поскольку другое сетевое обновление доставляется во время обработки тика сервера.

Эти результаты можно найти в анализе Battle (Non) Sense Update #14. Как видно из приведенной ниже таблицы, когда живы 40 человек, средняя задержка стрельбы снижается с 94,5 мсек до 77 мсек (снижение на 18% ).

Улучшения в обновлении #19

Профилирование результатов до обновления #19 и новая гипотеза

Так выглядят данные профиля перед обновлением #19 для ПК, снятые 25 июня 2018 года, когда живы 90 игроков:

Время очистки сети составляет 43,2 мс, что составляет 41% от общего времени кадра. Большая часть этого времени используется для «сериализации» - тиражирования каждого актора клиенту. «Сериализация» - это процесс записи данных в память в определенном порядке, доставки статуса актора клиенту через сеть.

Когда мы искали метод оптимизации, основанный на приведенном выше профилировании, мы подумали: «Если мы сможем уменьшить количество реплицированных акторов, особенно персонажей, общее время этапа Net Flush значительно сократится».

В отличие от других игр, которые используют выделенный сервер в Unreal Engine, на сервере PUBG одновременно играет до 100 игроков - это значит, что количество акторов значительно выше. Большой размер данных об акторах - уже проблема, но общее количество участников - еще большая проблема. Когда мы думали о способах сокращения общего количества участников, мы решили, что хорошим решением станет репликация персонажей вдалеке на более низкой частоте. Поскольку расположенные далеко персонажи не имеют значения, количество акторов, участвующих в «сериализации», может быть значительно уменьшено без ущерба для игры, и в результате время, затрачиваемое на этап «Net Flush» может быть уменьшено.

Процесс разработки: система чередования репликации

Исходя из вышеприведенной идеи, мы решили внедрить систему, которая пропускает запросы репликации до более подходящей частоты в зависимости от расстояния между клиентом и актором. Мы назвали это «системой чередования репликации». Сначала мы доработали раздел, где акторы реплицировались, и понизили частоту репликации далеко расположенных персонажей. Затем мы проанализировали проблемы и типы визуальных изменений.

Как только мы смогли решить проблемы, возникшие при уменьшении частоты репликации, мы протестировали, насколько сильно можно снижать данную частоту и пришли к выводу, что снижение частоты репликации до 1/4 от исходной, не оказывало влияния на игровой процесс.

Финальная версия системы чередования репликации была реализована следующим образом:

  • Решить, сколько кадров репликации будет пропущено в зависимости от расстояния
  • Выполнить один из трех шагов: Шаг 1 пропускает 1 кадр, шаг 2 пропускает 2 кадра, а шаг 3 пропускает 3 кадра.

После внедрения системы наш отдел по контролю за качеством провел тестирование, чтобы найти соответствующее значение расстояния для каждого шага. Результаты тестов показали, что пропуск 3 кадров приводил к слишком сильным визуальной дрожи в движении персонажей, поэтому мы удалили шаг 3. Окончательные значения для каждого шага следующим:

  • Шаг 1: Пропускать 1 кадр у персонажей, расположенных дальше 70 м
  • Шаг 2: Пропускать 2 кадра у персонажей, расположенных дальше 400 м

Примечание: такие настройки применены на данный момент, но в дальнейшем они могут меняться, для улучшения производительности сервера и более плавных движений

Результат улучшения

После внедрения новой системы, производительность сервера увеличилась на 20%. На приведенной ниже диаграмме мы отслеживали частоту кадров на серверах в региона NA, когда в живых было 85 игроков. После обновления частота обновления сервера увеличилась на 22% с 18,5 до 22,9. Другие регионы также показали увеличение частоты кадров, в среднем на 20%.

Не менее отличными новостями стало и то, какие изменения произошли со временем отклика. Вы можете посмотреть  видео-анализ обновления #19 на канале Battle (non) Sense.

В приведенной выше таблице вы можете видеть, что, когда 85 игроков живы, среднее время задержки для стрельбы уменьшилось на 58%, с 149,4 мсек до 61,6 мсек, это подтверждает то, что проблем с де-синхронизацией стало значительно меньше.

Благодаря другим улучшениям, помимо чередования репликации, скорость тика сервера увеличилась на 20%, а сетевая задержка снизилась на 50%, когда в живых остается более 80 игроков.

В заключение

Повышение скорости обновления сервера является постоянным приоритетом работ для команды с момента запуска PUBG. В дополнение к решению проблем программного обеспечения, нами были усовершенствованы и аппаратные средства. Однако мы знаем, что за последние несколько месяцев, предшествующих обновлению #19, игроки не замечали явных улучшений.

Во время кампании #FIXPUBG мы удвоили усилия по улучшению производительности сервера и продолжили исследования и эксперименты с различными идеями, однако, вы должны понимать, что это очень трудоемкий процесс.

Для реализации даже одного улучшения, необходимо провести предварительные исследования, а после внедрения улучшения требуется выполнить большой объем задач по его анализу, проверке и тестированию. Трудно решить все проблемы за короткий промежуток времени, потому что усилия и время должны постоянно распределяться на решение каждой проблемы. Неправильная реализация улучшений может вызвать большие проблемы. Поэтому процесс их выпуска должен происходить с максимальной осторожностью и тщательностью.

Пояснив данный момент, мы хотим сказать, что после выпуска улучшений, о которых мы уже говорили, мы начали работу над оптимизацией этапа «Net Dispatch». Согласно нашему анализу, на обработку перемещения персонажей уходит достаточно много времени, и мы обнаружили определенные возможности для оптимизации процесса. Движение персонажей оказывает большое влияние на игру в PUBG. Поэтому мы уделим много внимания реализации этой задачи, чтобы гарантировать, что любые внедренные улучшения не вызвали проблем с визуальным отображением передвижения персонажей - например, дрожании, о котором мы упоминали выше.

Мы уже экспериментируем с некоторыми идеями, и ожидаем, что время затрачиваемое на этап «Net Dispatch», упадет более чем на 50% (при нынешних 41,8 мсек), если наши наработки не встретят проблем на этапе тестирования. После успешного внедрения, стабилизация данного улучшения займет более месяца, но мы продолжим работать над этим и постараемся внедрить это улучшение как можно скорее.

Нашей конечной целью является постоянная планка тикрейта сервера на уровне 30, начиная со 100 игроков, до самой последней пули. Мы будем прилагать все усилия для достижения этой цели, чтобы мы могли продолжать получать наилучший из возможных опытов игры в Battle Royale.

Благодарю за внимание,
Санг-кюн Ким,
Начальник отдела разработки, PUBG Amsterdam

Какой сейчас тикрейт у серверов PlayerUnknown’s Battlegrounds? Ответ на этот вопрос вы узнаете в нашей новости! Напомним, что уже завтра утром новый патч под номером #20 выйдет на основных серверах PUBG.

Источник: forums.playbattlegrounds.com