Слово инженерам: разработка приложения WoW Companion
Одним из самых значительных технических улучшений, добавленных в приложение WoW Companion для дополнения Shadowlands, стала поддержка нескольких дополнений. Мы знаем, что об этой возможности просили многие игроки, и сегодня мы хотели бы рассказать вам о трудностях, с которыми мы столкнулись в процессе разработки таких масштабных технологических изменений, а также о некоторых принятых нами решениях.
Немного истории
Изначально приложение WoW Companion создавалось для поддержки лишь одного дополнения: Legion. По мере приближения выхода Battle for Azeroth мы решили в первую очередь разработать значительные улучшения программной части сервиса, в том числе добавить возможность совместного использования кода для мобильного приложения и клиента на PC, благодаря чему мы смогли воспользоваться множеством функций и инструментов пользовательского интерфейса основной игры, ранее недоступных для приложения. Но за счет этого мы не смогли разработать необходимое программное обеспечение для поддержки более, чем одного дополнения одновременно — поэтому мы сменили единственное возможное поддерживаемое дополнение с Legion на новейшее Battle for Azeroth.
Мы знаем, что игроки были недовольны потерей доступа к контенту дополнения Legion в приложении, когда мы внесли это изменение, поэтому для Shadowlands мы решили добавить возможности поддержки нескольких дополнений. Вдобавок к этому команда разработчиков мобильного приложения с радостью была готова взяться за возможность вернуть доступ к контенту Legion, чего и хотели игроки.
Мы кратко обсудили возможность частичной поддержки предыдущих дополнений, чтобы посвятить максимально возможное количество времени контенту Shadowlands, но быстро пришли к выводу, что следует восстановить как можно больше функций. Мы также знали, что с выходом Shadowlands игроки получат возможность развивать своих дополнительных персонажей в дополнении Legion при помощи путешествий во времени, и мы хотели бы предоставить таким игрокам полную поддержку мобильных устройств для развития их персонажей.
Как оказалось, в приложении еще оставались участки кода, уникальные для дополнения Legion, что принесло несколько неоднозначную пользу. Также благодаря системе управления версиями у нас также был доступ к оригинальным материалам Legion, благодаря чему возвращение контента Legion стало прекрасной возможностью протестировать наше новое программное обеспечение поддержки нескольких дополнений. И хотя нужно было добавить в приложение не так уж и много, тем не менее, четко разграничить дополнения Legion и Battle for Azeroth было не так уж просто.
Для создания программного обеспечения поддержки нескольких дополнений нам потребовалось три главных элемента:
- Приложение должно иметь возможность удалить все данные вашего текущего дополнения и отправить на сервер запрос данных нового дополнения.
- Нам было необходимо разграничить код элементов интерфейса, уникальных для конкретных дополнений, чтобы функции оставались раздельными.
- Нам было необходимо разбить материалы, уникальные для конкретных дополнений, чтобы снизить затраты ресурсов приложением.
Данные дополнений
Когда изначально разрабатывалось приложение WoW Legion Companion, большинство участков кода серверов, обрабатывающих запросы от приложения, было создано таким образом, что они могли вернуть только данные, соответствующие дополнению Legion. Когда пришло время перехода на дополнение Battle for Azeroth, мы изменили эти функции, чтобы они могли возвращать данные нового дополнения. Но в этот раз нам была нужна возможность получать данные для любого выбранного дополнения, что означало необходимость обработать все функции сервера, отвечающие на запросы мобильного приложения, и изменить их таким образом, чтобы они могли принимать особые параметры, указывающие на то, из какого дополнения следует брать данные. Например, для запроса данных о соратниках необходимо указать тип соратника (например, соратник из дополнения Legion или из дополнения Battle for Azeroth), а для запроса о локальных заданиях необходимо указать, в каких зонах требуются данные о заданиях.
В самом приложении также было несколько участков кода, которые были расширены специально для поддержки дополнения Battle for Azeroth. Во время Legion приложение могло запрашивать только ресурсы оплота класса; в Battle for Azeroth мы просто добавили военные ресурсы в соответствующее сообщение. В Shadowlands вместо того, чтобы добавлять новые и новые типы валюты в одно и то же сообщение, мы решили переместить всю систему ресурсов в новое программное обеспечение клиента для PC с общим кодом, которое было разработано для Battle for Azeroth. Это значит, что теперь при любом выбранном дополнении приложение сможет запрашивать соответствующие типы валюты — для нас не будет необходимости вручную указывать, какая именно валюта требуется.
Код интерфейса
Значительная часть кода, обеспечивающего поддержку дополнения Battle for Azeroth, опирается на существующий код Legion, в результате чего стало сложнее понять, какие элементы активно используются в тот или иной момент. К примеру, список соратников в Battle for Azeroth обладал возможностью отображать вооружение, однако соответствующая кнопка была скрыта, так что код не использовался. Функции дополнений Legion и Battle for Azeroth были в достаточной мере схожи, так что подобные моменты не вызывали больших затруднений. Тем не менее, мы понимали, что поддерживать подобную архитектуру станет невозможно после появления новых функций Shadowlands. Если в общий код Legion и Battle for Azeroth добавить поддержку медиумов и ковенантов, то он станет еще сложнее.
Вместо этого мы проанализировали все скрипты, определили, какие функциональные особенности были общими, а какие — уникальными для каждого дополнения. Мы разделили код, связанный с конкретными дополнениями, на подклассы и сугубо новые составляющие, оставив в основных классах только общие, базовые функции. На основе новых подклассов мы создали новые игровые объекты для каждого дополнения. Несмотря на общую систему и сходство большинства функций, только списку заданий Legion нужна кнопка спутников, при этом списку приключений Shadowlands не требуется структура из двух вкладок, использовавшаяся в Legion и Battle for Azeroth, однако в этом списке значки типов заданий должны уступить место портретам противников.
Другое важное системное изменение в приложении, приуроченное к выходу Shadowlands, связано с созданием файлов баз данных. Теперь при создании кода баз данных и файлов данных приложение WoW Companion использует те же процессы, что и версия игры для PC. Это изменение, в частности, положительно скажется на работе кода, определяющего, на какой карте должны отображаться метки локальных заданий. Изначально приложение использовало заданные вручную алгоритмы для каждого идентификатора карт, что не представляло особых трудностей, пока список зон ограничивался Аргусом и Расколотыми островами. По мере добавления новых зон в Battle for Azeroth система стала чрезмерно громоздкой. Мы откажемся от этой части кода в Shadowlands, поскольку нам удалось легко извлечь таблицы базы данных пользовательского интерфейса карт, чтобы сделать систему полностью динамической. Мы преобразовали большой кусок кода, отвечавшего за обработку зон трех дополнений, в оптимизированную функцию, способную автоматически обрабатывать любые локальные задания без использования алгоритмов для конкретных дополнений.
Файлы материалов
Существенное различие в работе над программами для мобильных устройств и PC заключается в том, что при разработке приложений для первых нам необходимо учитывать, что игроки могут пользоваться мобильным подключением к сети с ограничением по загрузке или недостаточным качеством соединения. Необходимо убедиться в том, что пользоваться приложением приятно и удобно, каким бы качество подключения ни было. Один из способов добиться этого — ограничить объем данных, которые необходимо загружать при использовании приложения.
В каждом дополнении очень много файлов материалов, и их объем может быстро достичь очень высокой отметки. Кроме того, переход от двух дополнений (Legion и Battle for Azeroth) к трем (включая Shadowlands) означал, что необходимый объем материалов утроится. Тем не менее, многие материалы — например, текстуры карт в высоком разрешении, фоны областей для заданий, портреты соратников и противников — уникальны для того или иного дополнения, и поэтому мы разделили их по пакетам. Благодаря этому приложению достаточно загрузить в память материалы, использующиеся выбранным дополнением, и таким образом объем задействованной памяти уменьшился.
Еще на раннем этапе мы также решили распределить дополнения по разделам, что позволило нам четко разделить их функции. Разделу Legion не требуется страница призывов ковенантов, а Shadowlands — окно заказанных войск. Как и изменения кода, эти нововведения упростят восприятие событий, представленных в приложении. Разделение материалов и разделов также означает, что все дополнения полностью самостоятельны, и упрощает для пользователей процесс загрузки.
Мы хотели предоставить игрокам больше возможностей для управления загрузкой материалов. Вы можете загрузить все сразу, пока подключение стабильно, или ускорить взаимодействие с приложением, отложив загрузки для определенных дополнений. А если вас в принципе не интересует какое-либо дополнение, то материалы для него можно вовсе не загружать. Каждому дополнению требуется от 30 до 40 Мбайт данных, а это уже ощутимая экономия на трафике.
Изменения процессов
Разделение материалов разных дополнений потребовало изменить два элемента внутренних процессов: средство курирования материалов должен был распознавать, к какому дополнению относятся те или иные данные, а инструмент создания пакетов материалов должен был получить возможность группировки материалов. Инструментарий курирования материалов представлял собой один из узкоспециализированных элементов, предназначавшихся для обеспечения поддержки Legion, а затем и Battle for Azeroth. Нам пришлось переработать его и сделать его более универсальным. Новая версия взаимодействует со списком дополнений, содержащим необходимый приложению контент (производя перебор по перечислению GarrisonType), и размещает материалы для каждого дополнения в отдельных папках. Изменения, благодаря которым средство курирования может использовать полный список дополнений, также подразумевают, что в будущем новые значения в списке будут получаться автоматически, что упростит добавление нового контента в приложение Companion и избавит нас от необходимости модифицировать инструментарий.
Средства создания файлов материалов и загрузки в значительной мере полагаются на функцию пакетов материалов в Unity, позволяющую приложению рассматривать разные версии пакета как один целый пакет. Процесс создания пакетов выдает разные варианты каждого пакета для всех дополнений в зависимости от структуры папок, созданных инструментом курирования. Пакеты материалов заменяются во время выполнения при переключении между дополнениями в приложении. Поскольку все варианты пакетов обрабатываются одинаково, любой код, запрашивающий, к примеру, портреты соратников, может работать корректно, какой бы набор портретов ни был загружен в настоящий момент. Таким образом код функций может действовать независимо от специфических особенностей загрузки/выгрузки материалов, словно каждое дополнение — единственное во всем приложении.
Путь в Темные земли
Неважно, проходите вы новые приключения в Shadowlands или развиваете персонажей в дополнении Legion, — нам не терпится предоставить вам доступ к новому контенту World of Warcraft, который всегда будет под рукой. Надеемся, вам было интересно узнать о нашей работе и о том, какими соображениями мы руководствуемся при разработке систем, обеспечивающих поддержку не только текущего, но и будущего контента в World of Warcraft.