С момента релиза Fortnite прошло уже без малого семь лет. Игра практически сразу добилась коммерческого успеха, но появление соревновательного режима Battle Royale вдохнуло в нее новую жизнь, превратив Fortnite в настоящий культурный феномен. Уже осенью 2018 года количество игроков в Fortnite: Battle Royale приблизилось к 80 миллионам, а через два года число зарегистрированных пользователей достигло 350 миллионов. Одновременно в «королевской битве» сражаются миллионы игроков с разных уголков мира. Как серверы Fortnite выдерживают подобную нагрузку?
Как и многие другие современные многопользовательские игры, Fortnite разработана на популярном движке Unreal Engine. В режиме Battle Royale 100 пользователей сражаются в одной игровой локации до тех пор, пока в живых останется только один. Когда игрок запускает на своем компьютере Fortnite: Battle Royale и нажимает на кнопку «Играть», локальный клиент устанавливает соединение с облачными серверами Epic Games. Там формируется группа, в которую входит 99 других игроков, после чего этой группе назначается игровой сервер. Там запущена копия серверного приложения Fortnite с загруженной картой. Игра начинается после подключения всех игроков, и ее действие разворачивается непосредственно на сервере, то есть, сервер в каждый момент времени определяет состояние многопользовательской игры.
Здесь следует отметить, что игровой сервер не транслирует картинку непосредственно на устройство пользователя: клиентское приложение передает на сервер управляющие директивы, соответствующие действиям игрока, а в обратном направлении отправляются данные, описывающие происходящие в игровом пространстве изменения. Изображение игрового мира и событий в нем формируется на локальной машине, там же хранятся все базовые карты и скины — клиент подгружает извне только локальные изменения, например, координаты случайным образом разбросанных по карте тайников с оружием. Иными словами, с использованием полученной информации об игровом мире и других игроках клиентское приложение строит максимально приближенную модель того, что происходит в настоящий момент на сервере.
Чтобы создать ощущение «мгновенности» происходящих событий, движок игры на локальной машине пытается прогнозировать события, которые произойдут на сервере в ближайшие секунды, заранее строит соответствующую картинку и подгружает необходимые звуки — это называется Client-side prediction. Благодаря этой функции у игрока складывается ощущение, что действие происходит в реальном времени и никаких задержек на самом деле нет. Однако если скорость передачи данных между клиентом и сервером низкая, либо сеть перегружена, могут возникнуть лаги: игроку кажется, что он попал в соперника, но тот на самом деле уже переместился в пространстве, и сервер не передал клиенту информацию о нанесенном уроне. По той же причине в некоторых играх пользователи могут увидеть маркеры попаданий там, где противник на экране отсутствует, либо замечают, что новые постройки появляются с некоторой задержкой. При этом ради экономии ресурсов игрок «видит» не всю карту, а только то, что происходит непосредственно вокруг него. В движке Unreal эта функция называется Replication Graph. Исследования, проведенные с использованием анализатора трафика Wireshark, показали, что в среднем клиентское приложение Fortnite отправляет на игровой сервер порядка 50 пакетов в секунду, а принимает около 30.
Поскольку игроки находятся в совершенно разных географических точках и подключены к интернету с использованием разных каналов связи, все они на самом деле играют в немного рассинхронизированную версию Fortnite: Battle Royale. Эти «несовпадения во времени» могут исчисляться буквально долями секунды, но именно они порой определяют в многопользовательских играх, кто из игроков, например, выстрелил первым. Подобные задержки не оказывают серьезного влияния на игровой процесс, если ты запустил Fortnite чтобы расслабиться дома после напряженного рабочего дня, но имеют решающее значение, если речь идет, например, о турнирной игре с серьезным призовым фондом. Тут на первое место выходят стабильность работы удаленных серверов, скорость соединения и пинг. Технический евангелист Amazon Web Services Ян Массингем говорит об этом так: «Когда 100 игроков одновременно передвигаются, ходят, стреляют и умирают в одной игровой зоне, для реализации этих многопользовательских элементов мне нужна инфраструктура, работающая в облаке, которая позволит мне делиться состоянием игрового мира с другими игроками. Это означает, что когда я стреляю из пистолета в игре, вы увидите, как в вашей копии клиента падает зомби».
С самого момента запуска Fortnite сетевая инфраструктура игры базировалась на облачной платформе Amazon Web Services (AWS). Нагрузка на игровые серверы Epic колеблется в зависимости от дня недели и времени суток, максимальный наплыв игроков обычно наблюдается в период рождественских праздников. Ежемесячно серверы Epic обрабатывают два петабайта данных, это примерно 223 000 DVD-дисков емкостью по 4,7 ГБайта каждый. AWS позволяет гибко управлять доступными ресурсами, по мере необходимости наращивая или сокращая их. Именно эта масштабируемость гарантирует стабильную работу всей инфраструктуры в целом даже в условиях значительного колебания нагрузок. Кроме того, инструментарий облачного провайдера позволяет защитить игровые серверы от DDoS-атак, которые являются значительной проблемой для гейм-индустрии. Как говорил в одном из интервью Бен Элбон, ведущий инженер по эксплуатации британского разработчика игр Jagex, «DDoS-атаки несут огромный риск для онлайн-игр. MMORPG гораздо менее устойчивы к сбоям, чем другие онлайн-сервисы. Когда вы и ваши друзья ведете ожесточенную битву с финальным боссом, к которой вы готовились несколько дней, даже тридцатисекундный сбой совершенно точно испортит ваш вечер».
В целях сокращения времени доступа к сервисам и веб-приложениям AWS имеет 55 географических зон доступности в разных странах и на разных континентах. Если какая-то одна зона выходит из строя, нагрузка динамически переносится на соседние. Fortnite запускается на серверах в 24 из 55 существующих зон доступности Amazon — это еще один важный фактор, влияющий на стабильность игровой экосистемы. Один из сотрудников Epic утверждал, что в каждом конкретном регионе разница между максимальной и минимальной пиковой нагрузкой на игровые серверы может достигать десятикратных значений. Облачная инфраструктура позволяет сгладить подобные колебания. Тем не менее, когда в феврале 2018 года к игре одновременно подключились 3,4 миллиона пользователей, в ней произошло шесть масштабных сбоев. Компания Epic объяснила это тем, что в одном из регионов своего присутствия она достигла технических ограничений, из-за чего игра вышла из строя. Очевидно, даже облака имеют строго определенные ресурсы и пределы возможностей.
Несмотря на то, что каждому игроку автоматически назначается наиболее подходящий ему игровой сервер исходя из целого ряда факторов: его географического местоположения, текущей загруженности и доступности серверов, пинг, то есть, промежуток времени, за который пакеты с данными долетают от компьютера с клиентом Fortnite до игрового сервера и обратно, может быть довольно большим. Путешествие пакета по сети проходит замысловатым маршрутом через множество роутеров и коммутаторов, каждый из которых добавляет собственную небольшую задержку, поэтому чем меньше физическое расстояние между клиентом и игровым сервером, тем лучше будет пинг.
В мультиплеерных баталиях именно пинг часто определяет, кто из игроков первым занял стену или критичный участок на карте, кто первым выстрелил, либо завладел аптечкой. Чем меньше задержки при передаче данных по сети, тем выше шансы на победу у игрока. Помнится, в конце 90-х мы с другими молодыми специалистами, только что окончившими институт и устроившимися на работу в НИИ, играли по сети в Quake в режиме Deathmatch. Большинство игроков тогда подключались к интернету по dial-up, у нас же в научно-исследовательском институте имелось оптоволокно, а игровой сервер был доступен по тому же самому широкополосному каналу, поскольку располагался в соседнем административном здании, превратившемся в офисный центр. У «модемщиков» против нашей команды просто не было ни малейших шансов. Этот простой пример наглядно показывает, почему скорость соединения с игровым сервером крайне важна. Пинг, как говорится, решает.
Epic Games демонстрирует в открытом доступе общедоступный статус своих серверов: на сайте компании любой желающий может узнать, работают те или иные серверы Fortnite в настоящий момент или нет, и когда они в следующий раз будут отключены для обслуживания либо установки обновлений. Сама Fortnite показывает игрокам технические подробности об их подключении, но это, что называется, «информация для сведения». А вот данные о точном местоположении игровых серверов компания Epic Games тщательно скрывает. Почему?
Среди поклонников Fortnite бытует миф о том, что где-то на Земле есть волшебные места с «нулевым пингом», в которых скорость обмена данными между клиентским приложением и сервером достигает максимальных значений. В дни проведения турниров профессиональные игроки стараются приехать в такие города, чтобы поселиться в гостиницах с качественным и высокоскоростным доступом в интернет. Тем не менее, точные адреса расположения серверов, вплоть до города и улицы, держатся в строжайшем секрете: признание того факта, что жители некоторых населенных пунктов имеют определенное преимущество в турнирах профессионального уровня перед другими игроками, не добавит репутации Epic очков. Не говоря уже о том, что это представляет определенную угрозу безопасности.
Тем не менее, сообщества фанатов Fortnite попытались вычислить такие локации. Если верить Estnn, на территории США игровые серверы располагаются в семи городах (включая Лос-Анжелес, Сан-Франциско и Портланд), в Европе локаций насчитывается шесть (в том числе, в Лондоне, Париже, Милане и Хельсинки), пять — в Азии, и по одному — в Австралии, Бахрейне и Южной Америке (Сан-Паулу). Такая инфраструктура должна обеспечить игрокам быстрый доступ к ближайшему серверу для надежного подключения к игре, и определяется, судя по всему, общим количеством пользователей Fortnite в различных регионах. Однако эти адреса время от времени меняются и серверы «переезжают» из одного дата-центра в другой. Что же касается конкретного числа серверов, то оно уж точно неизвестно никому, кроме ответственных сотрудников Epic, поскольку в одной и той же локации таких машин может насчитываться сразу несколько. При этом одни и те же физические серверы могут обслуживать пользователей различных игр: Rocket League, Lego Fortnite, Racing, Festival, но если вы находитесь поблизости от одного из таких мест, скорее всего, у вас будет низкий пинг в большинстве многопользовательских игр Epic.
Тем не менее, пресловутый «нулевой пинг» физически недостижим, даже если вы играете в локальной сети, поскольку небольшие задержки при передаче данных все равно будут возникать. Важно лишь то, что в мультиплеере ваш пинг сравнивается с показателями соперников, и чем больше эта разница, тем выше (или, наоборот, ниже) ваше преимущество. Тем не менее, когда 100 игроков одновременно передают на сервер данные о своих выстрелах и перемещениях, а сервер, обработав их, возвращает сведения об изменениях на карте каждому игроку, нередко возникает перегрузка из-за большого объема передаваемых и анализируемых данных. В такие моменты не имеет значения, насколько мощный компьютер использует игрок и насколько хорош его пинг — лаг может возникнуть на самом сервере, и сделать с этим ничего нельзя.
Но перегруженный сервер — это далеко не единственная причина, по которой пользователи могут наблюдать задержки или некорректное поведение игры. Еще одна возможная причина — потеря пакетов из-за ненадежного интернет-соединения. Многие игры на основе Unreal Engine, включая Fortnite, по умолчанию используют протокол UDP, отличительной особенностью которого является отсутствие гарантии доставки пакетов. Если вы играете в Fortnite по Wi-Fi на частоте 2,4 Мегагерца, а поблизости кто-то включит микроволновую печь или решит посмотреть фильм в онлайн-кинотеатре с использованием того же соединения, у вас могут возникнуть проблемы. Наконец, игровые серверы Fortnite передают игрокам данные об изменениях на карте с максимальной частотой до 30 пакетов в секунду. Потому даже если клиент Fortnite будет установлен на современном компьютере с огромным объемом оперативной памяти и мощной видеокартой, подключенном к очень быстрому интернет-каналу, пользователь все равно не получит подавляющего конкурентного преимущества перед другими игроками. Хотя игра на его мониторе, возможно, будет выглядеть лучше, чем, скажем, на стареньком ноутбуке.
Иными словами, Epic Games делает все, чтобы игровая инфраструктура Fortnite была максимально надежной, и использует для этого современные облачные технологии. Но реальность такова, что скорость обмена данными и быстродействие игры на самом деле зависят от огромного числа различных факторов, значительная часть которых находится вне зоны контроля самого игрока. Впрочем, исходный код Unreal Engine доступен для изучения, и исследовав его, игроки теоретически могут найти способы повысить свои шансы на победу в мультиплеере. И не только в Fortnite.
Статья поддерживается командой Serverspace.
Serverspace — провайдер облачных сервисов, предоставляющий в аренду виртуальные серверы с ОС Linux и Windows в 8 дата-центрах: Россия, Беларусь, Казахстан, Нидерланды, Турция, США, Канада и Бразилия. Для построения ИТ-инфраструктуры провайдер также предлагает: создание сетей, шлюзов, бэкапы, сервисы CDN, DNS, объектное хранилище S3.
IT-инфраструктура | Кешбэк 17% по коду HABR