Полезные ресурсы

Как создавалась космическая MMO-игра Age of Ascent с облаком Microsoft Azure

Age of Ascent от Illyriad Games — это массовая многопользовательская онлайн-игра про космос, работающая на  Microsoft Azure. Важнейший аспект игры, отличающий ее от других представителей жанра – это возможность селить десятки тысяч игроков в единый мир, вовлекая их в масштабные сражения и исследования. Это стало возможным благодаря учету возможности запуска игры на тысячах компьютеров, не забывая при этом о цельной и сложной вселенной. 

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

Сейчас поддержка глобальных сражений находится в разработке и будет представлена в финальной версии игры. Игровой процесс, основанный на космических битвах, представляет важную часть игры и будет представлен в 2015 году.

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

MMO и облака

MMO-игры, такие как EVE Online и World of Warcraft – это возможность для гейм-дизайнеров создать действительно фантастический мир, в котором может быть все — от историй и мистики до огромных неисследованных галактик и планет. В таких мирах игроки могут сражаться, исследовать мир, выполнять миссии, создавать команды и кланы и определять свои собственные цели и задачи. 

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

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

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

Для конечного же пользователя все это должно выглядеть как единый цельный мир. 

Облако Microsoft Azure стало для компании Illyriad жизнеспособным решением для создания такого мира. У Azure есть возможность подключать и отключать «железо» по запросу, в реальном времени, в зависимости от числа людей в игре, и делать это за очень небольшую цену.

Age of Ascent — первая MMO, в которой есть действительно открытый мир такого масштаба, создание которого раньше не представлялось возможным. Давайте посмотрим на некоторые ключевые моменты разработки игры, и то, как она создавалась с нуля маленькой командой, а также то, как она была запущена на Microsoft Azure.

Age of Ascent и Azure

После того, как Illyriad Games попробовали несколько хостинг-провайдеров для Age Of Ascent, ими была выбрана платформа Azure. Игра была создана с учетом полного использования всех возможностей платформы. Один из главных моментов, повлиявших на решение, заключался в том что платформа Microsoft Azure это возможность автоматизировать множество вещей из процесса разработки, позволяя небольшим командам разработчиков делать большие проекты. PaaS-решения обычно хороши для разработки, потому что с ними программистам нужно делать меньше работы, и благодаря этому они могут ускорить путь от идеи до работающей системы. А так как нужно меньше работ по администрированию и управлению, то и затраты на поддержку становятся меньше. Кроме того, снижаются риски, становится меньше возможностей допустить ошибку, и создание приложений становится более надежным процессом. 

Для того, чтобы создать игру подобного масштаба, Illyriad Games плотно работают с технологическим центром Microsoft и командой стратегических технологий и технического евангелизма Microsoft, у которых есть большой опыт по работе с высоконагруженными проектами на Microsoft Azure. 

Age of Ascent как массивная система с многопользовательским доступом полагается на ряд важных характеристик Azure с учетом следующих требований:

  • Игра должна быть отзывчивой, поэтому критичным было иметь хороший канал данных и доступ к сети без задержек для разделения игры по дата-центрам, расположенным по всему миру.
  • Гейм-дизайнеры не хотят напрямую управлять процессом подключения игроков к тем серверам, которые находятся ближе, поэтому использовался Microsoft Azure Traffic Manager, который предоставляет возможность автоматически выбирать ближайший сервер для обеспечения лучшего взаимодействия с игрой.
  • Сеть доставки контента Microsoft Azure (CDN), которая предоставляет дополнительные «граничные» узлы по всему миру, используется для кэширования часто скачиваемых файлов.
  • Для сохранения игровых и пользовательских данных использовалась система хранения данных Microsoft Azure, которая предоставляет постоянно-доступное хранилище с тройным резервированием данных и распределением их по разным дата-центрам, что позволяет не заботиться о доступности данных, однажды попавших в систему – они всегда будут доступны.

Высокоуровневая архитектура

Age of Ascent – игра браузерная, и пользователи соединяются с Microsoft Azure через Web-сокеты по SSL. Когда игроки совершают разные действия, такие как перемещение или стрельбу, данные передаются через Web-сокеты, то же самое происходит со внешними событиями — данные о корабле, появляющемся в поле зрения, или о том, что в игрока попали, возвращаются назад через Web-сокеты. 
Серверная игровая логика распределена по многим дата-центрам Azure, и она отвечает за управление вселенной, отправку игровых данных по разным системам для того, чтобы вселенная была доступна целиком и работала как единый цельный механизм.

HTML5, JavaScript, и WebGL

Игре нужен современный браузер, поддерживающий HTML5, такой как Internet Explorer 11, Firefox или Chrome. В выборе браузеров одним из важных моментов было то, что пользователи не должны устанавливать дополнительный плагин или загружать что-то лишнее. Важно окунуться сразу в игровой процесс – вот одно из главных требований к таким играм. Игра использует WebGL — API языка JavaScript для вывода графики. WebGL — важная часть игрового опыта, так как она позволяет использовать видеокарту для обработки изображений и физики, что делает графику более качественной, и все это без необходимости использовать дополнительные модули. Над всем этим находится Three.js, легковесная JavaScript-библиотека, используемая на клиенте для создания и отображения анимированной 3D-графики в игре.

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

Сервисы маршрутизации

Когда пользователь подключается к игре, браузер создает Web-сокет, связанный с конкретным браузером в Microsoft Azure. Этот сокет используется для двунаправленного дуплексного соединения между браузером и backend-системой, получающей команды пользователя и отдающей пакеты данных, необходимые для отрисовки окружающей вселенной.

В отличие от более традиционного HTTP-траффика, у которого нет набора состояний, модель Web-сокетов имеет четкую привязку к конкретному веб-серверу, где хранится и обрабатывается информация о контексте сокета. Сервис маршрутизации знает о таких привязках и помогает управлять ими в процессе получения данных с новых доступных серверов и справиться с проблемами если соединение с сервером потеряно и нужно его восстановить. Сервис маршрутизации работает как набор рабочих ролей в Microsoft Azure и использует стандартное распределение нагрузки для каждой роли. Когда пользователи соединяются с этим сервисом, сразу выполняются все нужные проверки безопасности и приходящие в систему сообщения проверяются на правильность структуры, возможность потери данных и использование читов пользователями.

Система управления интересами

Управление интересами — процесс уменьшения огромного размера вселенной и объектов, населяющих ее, до того размера, который важен для конкретного пользователя в данный момент времени и пространства. Учет местоположения и удаленности от игрока снарядов, взрывов и других космических кораблей делает игровой процесс гораздо лучше. Не имеет смысла сообщать игроку о корабле, находящемся на огромной дистанции от него, в отличие от случая, когда этот корабль приближается, поэтому Age of Ascent использует события с большими и маленькими задержками для лучшего отображения игровой вселенной. Отрисовка тысяч кораблей рядом с пользователем с большой частотой гораздо больше влияет на ощущения от игры, чем, например, детальная прорисовка взрыва на большом расстоянии.

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

Управление трафиком в Microsoft Azure

Система управления траффиком в Microsoft Azure отвечает за подключение пользователей к подходящему дата-центру. Она поддерживает несколько вариантов маршрутизации, но в данном случае единственным актуальным требованием является подключение клиента к дата-центру с наименьшей задержкой.

Коммуникационные системы

Комуникационные системы были разработаны специально для оптимизации соединений внутри игры. Для каждого сегмента маршрутизации и сервера управления интересами существует свой коммуникационный сервер. Это позволяет убедиться в высокой доступности всех необходимых данных. Эти сервера управляют всеми коммуникациями внутри кластеров, и проверяют то, что каждый сервер интересов получил все необходимые сообщения для управления своей частью вселенной. Умная фильтрация запросов ограничивает отправку сообщений тем подсистемам, которым они не нужны.

Входной контроль

Игроки, подключащиеся к игре, не имеют прямого доступа к ней. Вместо этого они проходят через специальный сервис, отвечающий за входной контроль. Такой контроль предоставляет ряд преимуществ, например возможность пресекать все некорректные или незаконные попытки попасть в игру. 

Сервис входного контроля находится на главной странице игры, поэтому, так как проверка происходит в фоновом режиме, на странице могут отображаться актуальная информация из игры, видео, новости и вообще что угодно. Игровые данные, хранящиеся в Microsoft Azure CDN, скачиваются для сокращения и без того небольшого времени загрузки игры. Размер игрового клиента меньше 9 мегабайт – с учетом всех включенных в него данных.

High latency service

С точки зрения игрового опыта важно дать игрокам почувствовать огромный масштаб вселенной Age of Ascent, но не настолько, чтобы браузер не справлялся с количеством приходящих ему сообщений. Сервисы с высокими задержками позволяют решить эту проблему с помощью обновления клиента каждые несколько секунд из-за важных событий, которые происходят далеко и пока не затрагивают пользователя. Эти события отрисовываются через несколько секунд после того, как они произошли, задержка же соотносима с расстоянием, на котором они случились, особенно в контексте того, как много времени пройдет пока игрок долетит до нужного места.

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

Сервис периодически считывает информацию из таблиц в Microsoft Azure CDN и создает файл, который сохраняется в хранилище Microsoft Azure, и в котором находятся все главные события, произошедшие в игровой вселенной за последние несколько секунд. Этот файл кешируется клиентом с Microsoft Azure CDN.

Тестирование

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

Цикл тестирования Age of Ascent состоял из продолжительной серии закрытых и открытых бета-тестов для получения обратной связи от пользователей о геймплее, удобстве и производительности. Собирались тестовые данные. В самом начале закрытые бета-тесты выполнялись на одном кластере для проверки того, как хорошо он работает. Дальнейшие тесты проводились уже на базе нескольких дата-центров для проверки того, как работают разные подсистемы. Для оптимизации производительности публичные бета-тесты проводились каждую неделю.

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

Однако было необходимо создать тестовых компьютерных пилотов.

Каждый пилот обычно водит один корабль, используя данные, полученные из записей в хранилище Azure. Visual Studio Test Manager использовался для того, чтобы правильно настроить и управлять тестовым кораблем, собирать логи и диагностическую информацию из тестовых полетов. Все тесты производились непосредственно из-под Azure, чтобы получать минимальные задержки и хорошее соединение с местом, откуда запускается игра.

На последней стадии цикла разработки, во время бета-тестирования, команда добавила в игру пилотов, имитирующих реальных игроков, для стресс-тестирования системы под дополнительной нагрузкой.

Масштабирование

Другой важный аспект тестирования заключался в понимании характеристик масштабирования построенной системы. В отличие от большинства других систем, где создатели представляют сколько примерно пользователей необходимо поддерживать, в процессе создания Age of Ascent встал вопрос о том, сколько пользователей может поддерживать одна минимальная конфигурация.

Команда разработала систему, основанную на единицах масштаба. Единица масштабирования – минимальная единица развертывания, которая для этого проекта состоит из:

  • 12 рабочих ролей сервиса маршрутизации
  • 12 рабочих ролей управления интересами
  • 2 рабочих ролей коммуникационных сервисов

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

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

В течение одного из масштабных бета-тестов в начале 2014 года, когда были задействованы все возможные игровые системы, через сервера проходило 267 миллионов запросов в секунду, каждый из которых был персонализирован и направлен конкретному игроку. Это соответствует примерно 100000 игроков, участвующих в одной продолжительной битве.