$ MRX.BEST $
-
Автор темы
- #1
Обратите внимание, пользователь заблокирован на форуме. Не рекомендуется проводить сделки.
В сегодняшнем блоге разработчиков мы хотели бы поделиться некоторыми достижениями, которых добились в улучшении производительности сервера. Кроме того, вы узнаете о новых улучшениях, над которыми мы сейчас работаем.
Версия Unreal Engine, используемая PUBG в настоящее время, основана на модели «клиент-сервер», поэтому статус каждого актора (акторы — это объекты, размещенные на уровнях и представляющие собой персонажей, здания, фоны, камеры и т. д.) должен обновляться сервером для каждого игрока.
Производительность сервера обычно рассчитывается по его «тикрейту» или частоте кадров. По мере увеличения производительности время на кадр будет уменьшаться. А поскольку время на кадр уменьшается, время ответа сервера также улучшается.
Чем быстрее сервер реагирует, тем быстрее ваши действия/перемещения обновляются для других людей. Примером может послужить то, как быстро вы исчезаете с экрана своего оппонента, нырнув за стену. Если мы хотим уменьшить то, что обычно называют десинхронизацией, необходимо улучшать время отклика сервера.
Производительность сервера обычно рассчитывается по его «тикрейту» или частоте кадров. По мере увеличения производительности время на кадр будет уменьшаться. А поскольку время на кадр уменьшается, время ответа сервера также улучшается.
Чем быстрее сервер реагирует, тем быстрее ваши действия/перемещения обновляются для других людей. Примером может послужить то, как быстро вы исчезаете с экрана своего оппонента, нырнув за стену. Если мы хотим уменьшить то, что обычно называют десинхронизацией, необходимо улучшать время отклика сервера.
Однако когда RPC отправляются в результате процесса Net Dispatch, это не происходит немедленно: они ставятся в очередь в буфере. Многие вещи, хранящиеся в буфере, отправляются всем клиентам во время этапа Net Flush, а буфер затем очищается.
В данной структуре RPC должен пройти этап Simulate & Render, чтобы попасть из Net Dispatch в Net Flush — это, в свою очередь, приводит к задержке. Вероятно, Unreal Engine был запрограммирован таким образом для того, чтобы уменьшить количество пакетов, отправленных в UDP. Когда количество пакетов сокращается, сеть работает более эффективно.
Поскольку в новой структуре появилось два сетевых обновления: Net Send Flush и Net Flush, скорость обновления сети после обновления №14 удвоилась, из-за чего некоторые люди предположили, будто скорость обращения к серверу (также известная как «тикрейт») увеличилась. Но связано это было не с «тикрейтом», а со скоростью обновления сети, которая поднялась до 60 тиков, поскольку другое сетевое обновление доставляется во время обработки тика сервера.
Эти результаты можно найти в анализе Battle (Non) Sense Update #14. Как видно из приведенной ниже таблицы — когда живы 40 человек, средняя задержка стрельбы снижается с 94,5 мсек до 77 мсек (снижение на 18%).
Когда мы искали метод оптимизации, основанный на приведенном выше профилировании, то подумали: «Если мы сможем уменьшить количество реплицированных акторов, особенно персонажей, общее время этапа Net Flush значительно сократится».
В отличие от других игр, которые используют выделенный сервер в Unreal Engine, на сервере PUBG одновременно играет до 100 игроков — это значит, что количество акторов значительно выше. Объем данных об акторах — уже проблема, но общее количество участников — еще большая. Задумавшись о способах сокращения числа участников, мы решили, что хорошим решением станет репликация расположенных вдалеке персонажей на более низкой частоте. Поскольку находящиеся далеко персонажи не имеют значения, количество акторов, участвующих в «сериализации», может быть значительно уменьшено без ущерба для игры. В результате время, затрачиваемое на этап Net Flush, уменьшится.
Как только удалось решить сложности, возникшие при уменьшении частоты репликации, мы протестировали, насколько сильно можно снижать данную частоту, и пришли к выводу: снижение частоты репликации до 1/4 от исходной не оказывает влияния на игровой процесс.
Финальная версия системы чередования репликации реализована следующим образом:
- решить, сколько кадров репликации будет пропущено, в зависимости от расстояния;
- выполнить один из трех шагов: Шаг 1 пропускает один кадр, Шаг 2 пропускает два кадра, а Шаг 3 пропускает три кадра.
- Шаг 1 — пропускать один кадр у персонажей, расположенных дальше 70 м;
- Шаг 2 — пропускать два кадра у персонажей, расположенных дальше 400 м.
Благодаря другим улучшениям скорость тика сервера увеличилась на 20%, а сетевая задержка снизилась на 50% (когда в живых остается более 80 игроков).
Во время кампании #FIXPUBG мы удвоили усилия по улучшению производительности сервера, продолжили исследования и эксперименты с различными идеями, но вы должны понимать, что это очень трудоемкий процесс.
Для реализации даже одного улучшения необходимо провести предварительные исследования, а после его внедрения требуется выполнить большой объем задач по анализу и тестированию. Трудно решить все проблемы за короткий промежуток времени, потому что усилия должны постоянно распределяться на различные задачи. Неправильная реализация улучшений может вызвать большие сложности. Поэтому процесс их выпуска должен идти с максимальной осторожностью и тщательностью.
Пояснив данный момент, мы хотим сказать — после внедрения улучшений, о которых мы уже говорили, начата работа над оптимизацией этапа Net Dispatch. Согласно нашему анализу, на обработку перемещения персонажей уходит достаточно много времени, и мы обнаружили определенные возможности для оптимизации процесса. Движение персонажей оказывает большое влияние на геймплей PUBG. Поэтому мы уделим много внимания решению этой задачи. Необходимо гарантировать, что внедренные улучшения не вызвали проблем с визуальным отображением передвижения персонажей — например, дрожания, которое упоминалось выше.
Мы уже экспериментируем с некоторыми идеями и ожидаем, что затрачиваемое на этап Net Dispatch время упадет более чем на 50% (при нынешних 41,8 мсек), если наши наработки не встретят проблем на этапе тестирования. После успешного внедрения стабилизация данного улучшения займет более месяца, но мы продолжим работать и постараемся внедрить его как можно скорее.
Конечной целью является постоянная планка тикрейта сервера на уровне 30: начиная со 100 игроков и до самой последней пули. Мы приложим все усилия, чтобы вы продолжили получать наилучший опыт игры в Battle Royale из всех возможных.
Благодарю за внимание,
Санг-кюн Ким,
начальник отдела разработки, PUBG Amsterdam