На некоторых устройствах Android игра Brawl Stars раньше загружалась около 35 секунд.
Это не самое приятное число, учитывая, что типичный матч длится около трех минут. Brawl Stars создана для быстрых сессий, в которые можно играть в небольшие свободные промежутки в течение дня. Если на запуск игры уходит 35 секунд, эти промежутки начинают исчезать. Игра становится менее спонтанной, в нее играют реже, и от нее проще отказаться.
Как говорит Дэмиен Мабин, разработчик Brawl Stars: «Вы не можете нормально поиграть во время короткого перерыва». Данные показали, что игроки на Android открывали игру реже, но проводили в ней больше времени, когда все же заходили. На iOS, где время загрузки было меньше, игроки заходили и выходили из игры гораздо свободнее. Время загрузки стало определять, когда люди могут играть.
Загрузка, ожидание, загрузка, ожидание
Толчком к тому, чтобы отвоевать эти лишние секунды, стала рекламная кампания.
Brawl Stars была перезапущена в Бразилии, где многие игроки используют старые устройства на Android. Производительность и время загрузки имели значение. И когда команда внимательно изучила ситуацию, масштаб проблемы стал очевиден.
Игра не была медленной из-за какой-то одной критической ошибки. В серверной не было «злодея». Процесс загрузки со временем просто превратился в нечто слишком последовательное для нужд игры.
Brawl Stars загружает множество ресурсов, прежде чем игрок попадет в игру. Файлы интерфейса. Текстуры. Звуки. 3D-модели. Данные анимации. Некоторые из этих ресурсов зависят друг от друга. Файл интерфейса может описывать кнопку, но текстура для этой кнопки все равно должна загрузиться. У экрана может быть свой звук. Персонажу может потребоваться модель, анимация и эффекты, прежде чем он сможет правильно отобразиться.
Старая система обрабатывала слишком много таких задач по очереди.
«По сути, это было: загрузка, ожидание, загрузка, ожидание», — говорит Дэмиен. — «И эта логика была разбросана по всей кодовой базе, напоминая спагетти».
Первой задачей было не ускорение экрана загрузки, а выяснение причин, почему он вообще работал медленно. Команде пришлось составить карту всех зависимостей между ресурсами: что должно загружаться раньше чего, что может происходить одновременно, а что казалось зависимым только потому, что никто долгое время не ставил это под сомнение.
Встречайте Titan
Именно здесь на сцену выходит Titan.
Titan — это наш внутренний игровой движок. На нем работают все игры Supercell, и он включает в себя инструменты редактора, используемые художниками, дизайнерами и разработчиками. Некоторые части являются общими для всех игр. Некоторые — специфичны для конкретной игры. Это не чистый коммерческий продукт, который был создан один раз и передан командам. Это лоскутное одеяло, выросшее из игр и функций, которые создавались, копировались, адаптировались, объединялись и переиспользовались на протяжении многих лет.
«Все началось с игрового кода», — говорит Эли Таттевен-Древе, разработчик игры mo.co. В первые дни существования Supercell у каждой игровой команды была своя кодовая база. Поскольку команды буквально копировали и вставляли один и тот же код в разные игры, Supercell начала собирать эти общие части в один внутренний движок. Этот общий движок и стал Titan.
Эта история отражена в движке. Некоторые системы были созданы быстро для одной игры, а затем использовались гораздо шире, чем кто-либо ожидал. Некоторые части отполированы. Другие содержат ошибки, старые допущения или проектные решения, которые имели смысл в то время, но теперь замедляют работу.
Преимущество заключается в доступе. Поскольку Titan — наш собственный движок, игровые команды могут зайти в системы, от которых они зависят, и изменить их. В данном случае это означало изменение самой системы загрузки вместо создания обходных путей.
Но Titan — это не только место, где игровые команды могут глубоко погрузиться в код, когда им это нужно. Существует также специальная команда Titan, которая делает эти общие системы более надежными, безопасными и полезными для всех игр Supercell. Это важно, потому что такая работа не должна оставаться запертой внутри одной команды. Когда команда решает сложную проблему в Titan, движок становится лучше для всех, кто его использует.
Заставляем игру делать больше одного дела одновременно
Вот как команде удалось внести правильные изменения в игру. Чтобы она перестала воспринимать загрузку как одну длинную очередь, где каждый ресурс вежливо ждет своей очереди.
Команда разбила процесс загрузки на более мелкие задачи: загрузить этот звук, загрузить этот файл интерфейса, загрузить эту текстуру, загрузить эту модель. Вместо того чтобы выполнять эти задачи по одному преимущественно последовательному пути, Titan смог поместить их в общую очередь и позволить нескольким рабочим потокам обрабатывать их одновременно, если это позволяли зависимости ресурсов.
«Технически идея проста», — говорит Дэмиен. — «Вы создаете задачи, помещаете их в очередь, а затем несколько потоков подхватывают их и выполняют параллельно».
Сложность заключалась в том, чтобы решить, что можно безопасно выполнять параллельно. Некоторые ресурсы все равно должны были ждать других. Экрану загрузки нужны определенные файлы, прежде чем он сможет появиться. Главному меню нужны другие. Но большая часть работы, которая раньше выполнялась шаг за шагом, теперь могла происходить одновременно.
Игра также должна подключаться к серверу, пока все это происходит. Сообщения сервера могут прийти до того, как ресурсы, необходимые для их обработки, будут готовы. Раньше это могло привести к сбою игры. Поэтому команда создала буфер: сообщения приходят, остаются в очереди и обрабатываются только тогда, когда игра готова к ним.
Именно здесь владение движком имело значение. Команде не пришлось искать обходные пути для системы загрузки. Они смогли изменить ее.
С 35 до 5
Первые результаты были весьма заметны.
На старых устройствах Android время загрузки сократилось с 35 секунд примерно до пяти или шести. На новых устройствах iOS оно уменьшилось с семи секунд примерно до двух с половиной.
Успех! Но это создало новую, немного глупую проблему.
Анимация логотипа Supercell при запуске длится около 2,8 секунды. Игра теперь иногда была готова раньше, чем заканчивался показ логотипа.
«Экран загрузки игры больше не отображался», — говорит Дэмиен. — «Игроки чувствовали, что что-то сломалось, и начали присылать нам отчеты об ошибках».
В итоге команда изменила поток так, чтобы логотип Supercell появлялся только один раз в день. После этого игра открывается быстрее. Лучшим отзывом о UX в данном случае была тишина.
«Если что-то работает хорошо, люди обычно этого не замечают», — говорит Дэмиен.
Однако сбои они заметили.
Не волшебный переключатель
Перевод загрузки в параллельный режим привел к состоянию гонки (race conditions) — распространенной проблеме в многопоточных системах, когда разные части работы могут завершиться в неожиданном порядке. Иногда один поток ждал ресурса А, пока другой ждал ресурса Б, и оба зависели от того, чтобы другой завершился первым.
Эти проблемы проявлялись двумя способами. Иногда игра вылетала. Иногда загрузка просто останавливалась, что было хуже, так как оставляло меньше очевидных подсказок.
«Это не сбой, поэтому, если вы не обратите на это внимание, вы не поймете, что происходит», — говорит Дэмиен.
Команда добавила аналитику, чтобы отслеживать, где загрузка зависает. Они искали моменты, когда прогресс останавливался, даже если не появлялось отчета о сбое. После первого релиза произошел всплеск сбоев. Команды Brawl и Titan потратили следующие несколько дней на их исправление.
Для игроков сбой означает, что игра не просто кажется медленной. Она ломается. Для команды разработчиков это означает, что нужно взять изменение, которое должно было упростить запуск Brawl Stars, и убедиться, что оно не создало еще более веской причины для ухода игроков.
Этот риск был понятен с самого начала. «Мы знали, что столкнемся с вылетами и нестабильностью», — говорит он.
Команда Brawl Stars была готова пойти на этот риск, потому что потенциальная выгода была очевидна. Другая команда могла бы принять иное решение, в зависимости от того, что больше всего нужно их игре в данный момент. Но для любой команды, желающей перенять подобный подход, фундамент уже существует.
Работа над загрузкой заняла в общей сложности около четырех месяцев: реализация, стабилизация, исправление сбоев и подготовка к производству.
Что изменилось для игроков
Очевидным результатом стала скорость. Но более интересным результатом стало поведение.
После изменения процесса загрузки поведение пользователей Android стало ближе к поведению пользователей iOS: более короткие сессии, но чаще. Игра больше не требовала от игроков планировать свое время с учетом экрана загрузки.
«Они могут играть так, как хотят», — говорит Дамьен. — «А не так, как их заставляет время загрузки».
Это та часть, которая делает работу менее похожей на инженерный трофей и более похожей на задачу игровой команды. Цель состояла не в том, чтобы график выглядел красивее, а в том, чтобы Brawl Stars снова вписалась в те короткие моменты, из которых состоит жизнь мобильных игр: поездка на работу, очередь, диван, подозрительно долгий поход в туалет.
Создание лучших инструментов внутри Titan
Работа Эли показывает ту же закономерность с другой стороны: дело не во времени загрузки, а в инструментах, которые люди используют для создания игр внутри Titan.
Он работает над инструментами и системами для художников, дизайнеров и других разработчиков. Часть этой работы происходит в тесном контакте с конкретной игровой командой, но проблемы знакомы всем в индустрии разработки игр: хрупкие рабочие процессы, общие файлы, которые блокируют работу других, инструменты, из-за которых простые изменения занимают больше времени, чем нужно.
Одним из его первых проектов была замена огромной электронной таблицы, которая управляла данными анимации.
«Это был один массивный CSV-файл», — говорит он. — «Если вы допускали опечатку, все ломалось».
Художники использовали эту таблицу для управления композицией анимации. В техническом смысле это работало, точно так же, как стул на трех ножках технически является стулом. Это было плохо для совместной работы, легко ломалось, и это не то, вокруг чего хотелось бы выстраивать рабочий процесс на постоянной основе.
Эли переделал это в визуальный редактор внутри Titan. Художники могли перетаскивать анимации на временную шкалу, перемещать их, добавлять эффекты и просматривать, как все будет выглядеть в игре. Работа заняла у него около шести месяцев, отчасти потому, что он только что присоединился к команде в качестве младшего разработчика, а отчасти потому, что создание правильного инструмента означало постоянное общение с художниками.
«Вы создаете лучший инструмент вместе», — говорит он. — «Вы выслушиваете их идеи, их опасения и придумываете лучшую систему».
Другой проект сделал нечто подобное для косметических предметов: скинов, нарядов и визуальных элементов, которые игроки могут собирать или экипировать. Вместо одной большой общей таблицы каждый косметический предмет стал отдельным файлом ресурса. Это означало, что несколько художников могли работать, не блокируя друг друга. Один художник мог протестировать больше своих собственных изменений, вместо того чтобы ждать, пока кто-то другой обновит общий файл.
Это редакторская сторона Titan. Менее заметная, чем время загрузки, но очень реальная для людей, создающих игру.
Честная версия
Все это не означает, что Titan безупречен.
«Многие системы не были рассчитаны на масштабирование», — говорит Эли. — «Везде есть баги. Это замедляет работу игровых команд».
Это часть работы над движком, который развивался вместе с «живыми» играми на протяжении многих лет. Крупные игровые команды могут оказывать давление на управление ресурсами, рабочие процессы редактора и конвейеры контента способами, к которым исходные системы не всегда были готовы. Некоторые части Titan были созданы быстро для одной нужды, а затем использовались гораздо интенсивнее, чем кто-либо ожидал. Некоторые части отполированы. Другие же, как выразился Эли, представляют собой машину, которая хорошо выглядит спереди, в то время как сзади все держится на клейкой ленте и молитвах.
Эли не считает это причиной избегать работы над Titan. Совсем наоборот.
«Весело работать с системой, которая немного сломана», — говорит он.
Он говорит это серьезно. Решение этих проблем важно для вполне реальной аудитории: художников и дизайнеров, пытающихся создавать лучшие игры.
«Мы не создаем технологии ради технологий», — говорит Эли. — «Вы создаете лучшие технологии, чтобы помочь художникам заниматься своим творчеством или помочь дизайнерам делать свою дизайнерскую работу».
Titan существует не для того, чтобы им восхищались. Он существует для того, чтобы сделать работу над играми лучше.
Помогите нам создавать то, на чем работают игры Supercell
Проект по сокращению времени загрузки сделал Brawl Stars быстрее. Он также показал, что может означать работа с Titan: глубокие технические проблемы, заметное влияние на игроков и общие системы, которые могут стать сильнее для каждой игровой команды.
Вы можете глубоко погрузиться в движок. Вы можете изменять системные компоненты движка, которые могут быть недоступны в сторонних движках. Вы можете взяться за проблему, которая затрагивает миллионы игроков, а затем провести несколько дней в «шахтах» по исправлению сбоев, потому что первая версия вела себя непредсказуемо. Вы можете создавать инструменты, которые избавят кого-то от необходимости работать с электронной таблицей, что является благородным делом в любой компании.
Работа не всегда бывает чистой. Но интересные проблемы редко встречаются там, где все идеально.
Titan и команда, стоящая за ним, растут. Цель не в том, чтобы сделать каждую систему идеальной за одну ночь, потому что в программном обеспечении так не бывает. Цель — сделать движок и инструменты сильнее, менее «ржавыми» и более полезными для каждой игровой команды, которая на них опирается.
Иногда это означает сокращение времени загрузки на 35 секунд. Иногда это означает дать художнику временную шкалу вместо электронной таблицы.
Иногда это означает позволить кому-то открыть Brawl Stars до того, как у него затекут ноги.
Изучить открытые вакансии
