Я разрабатываю версию «Эvolutions: Battle for Utopia» для Android. Этой весной iOS-аудитория с интересом встретила новинку, а мы уже готовимся к первым впечатлениям пользователей Android. В этой статье я расскажу о том, как мы портировали игру на Android и с какими трудностями и нюансами столкнулись в процессе.
«Эvolution» на iOS Если посмотреть на мобильные игры в целом, то на рынке сейчас мало таких проектов, как «Эvolution» — больших, сложных, затратных, требующих большой команды для разработки.
Создание игр с таким количеством механик, каждая из которых, по сути, представляет собой отдельную мини-игру, — процесс долгий и кропотливый: их нужно не только сделать, но и потом соединить, пришлифовать, убедиться, что все работает вместе как надо и вызвало у пользователя интерес, а не недоумение.
Таких игр мало даже на iOS, для которых студии охотнее создают игры, а на Android практически нет. Лирическое отступление «Эvolution» вышла в России 31 января 2014 года, 19 марта была представлена мировой аудитории на Game Developers Conference, которая прошла весной этого года в Сан-Франциско, а 2 апреля состоялся международный релиз.
Игра вошла в десятку лучших игр для iPad в 30 странах — и это несмотря на то, что «Эvolution» вышла на рынок практически одновременно с Hearthstone от Blizzard Entertainment, которого с нетерпением ждали фанаты.
Сегодня в нашу игру ежедневно заходят более 73 000 игроков из 198 стран мира.
Более 41% игроков проживают в России, более 20% — в США и еще 5,7% — в Великобритании.
Сложное разнообразие.
Android — это специфическая платформа.
Начнем с того, что в iOS всего пять разрешений экрана, что, конечно же, упрощает разработку приложений.
На Android количество разрешений исчисляется сотнями, если не тысячами.
С технической точки зрения при отрисовке графического интерфейса для этой платформы он привязан к углам.
Но иногда его растягивают, а не рисуют попиксельно — например, фоны, из-за чего страдает графика или нарушаются пропорции.
В iOS мы всегда знаем, как будет выглядеть наша картинка; В Android все не так просто.
На рынке Android-устройств представлено множество различных моделей с разной производительностью, но при этом проще контролировать установку на разные устройства; например, в iOS сложно ограничить количество устройств, на которых может запускаться приложение.
В описании приложения можно отметить, что iPhone четвертого поколения его не поддерживают. При этом на этих устройствах она запускается, в нее можно играть, но в принципе никто не гарантирует, что она не вылетит или не сделает еще что-то не по плану.
В Android можно указать конкретные устройства, для которых человек скачивает игру, и разместить множество раздач для разных графических чипов.
Для iOS мы публикуем один-единственный дистрибутив.
Некоторые публикуют два: один для планшетов и один для смартфонов.
Android требует разных дистрибутивов, которые компилируются в зависимости от чипа, сжатия текстур и других параметров.
В некоторых играх приходится делать около 5-6 разных билдов, что, конечно, усложняет процесс развертывания приложения.
Когда делается несколько дистрибутивов для разных графических процессоров, мы загружаем их в Google Play; когда клиент скачивает приложение, цифровой магазин сам выбирает сборку для графического процессора устройства и выдает ее.
Все графические чипы iPhone принадлежат к одному семейству PowerVR, поэтому мы всегда можем очень точно предсказать производительность игры.
В Android есть четыре распространенных графических чипа, которые работают по-разному.
Мы столкнулись с тем, что приложение на этой платформе работало настолько медленно, что приходилось переделывать шейдеры, снижать их качество или вообще отключать.
В Android блики рассматриваются в вершинном шейдере, а в iOS — в пиксельном шейдере.
Поэтому мы использовали стандартный метод повышения производительности ценой некоторого ухудшения изображения — перенос вычислений из пиксельного шейдера в вершинный.
Еще одна сложность, с которой мы столкнулись при портировании «Эvolution»: на Android нет формата сжатия текстур с альфа-каналом, совместимого со всеми устройствами (ETC1 (4бит) vs PVRTC4/2 (4/2 бит с альфой).
Несжатые текстуры не поддерживаются.
только трата памяти и увеличение размера приложения, но и увеличение времени загрузки приложения, и потеря производительности.
С технической точки зрения отсутствие сжатия текстур с альфа-каналом - это очень плохо.
, очень большое ограничение платформы Android. В стандарте графического API OpenGL ES 2.0 указан только формат ETC1, который уже устарел и не содержит альфа-канала.
iOS имеет очень хороший графический чип: помимо того.
что текстуры с ним занимают меньше памяти, да и загружаются быстрее.
При перегрузке сцен с большим количеством текстур в игре, на iOS это происходит мгновенно, а на Android с заметной задержкой, которая в нашем случае доходила до 1,5. секунд. К сожалению, нам приходилось работать с тем, что у нас было, либо использовать форматы сжатия, специфичные для конкретной аппаратной платформы: PVRTC, DXT, ATC, ETC. В принципе, проблему сжатия с альфа-каналом разработчики Android планируют решить в следующем стандарте OpenGL ES 3.0: там появится хороший расширенный формат сжатия (ASTC), и жизнь всем сразу станет проще.
Это основные трудности при портировании приложения с iOS на Android. Были и другие проблемы, например ограничение размера APK. Для Android этот показатель составляет 50 Мб, тогда как на iOS есть ограничения только на загрузку с сотовой связи.
Версия игры для iOS представляет собой один файл размером примерно 420 МБ; на Android игра разделена на небольшой APK-файл, из которого впоследствии загружается большой OBB-файл, содержащий игру.
Однако Unity делает большую часть работы за вас.
Как это произошло у нас Можно сказать, что исторически мы сначала разрабатываем игру для устройств Apple, а потом портируем ее.
Конечно, вы можете разработать игру сразу для двух платформ, а можно и для трёх.
Например, мы также выпустили «Juggernaut: Revenge of Sovering» просто для настольных компьютеров MAC или OSX. Портирование с iOS на Android значительно упрощается, если игра сделана под Unity. Достаточно просто запустить его на новой платформе — и сразу становится очевидно, куда нужно идти с файлом и что нужно доделать, чтобы результат выглядел нормально.
Если игра не для Unity, то у меня плохие новости: фактически вам придется писать ее заново.
Портирование «Эvolution» на Android заняло у нас около двух месяцев.
Как я уже говорил, игру очень сложно как разрабатывать, так и портировать.
Дело в том, что она сочетает в себе несколько разных геймплеев.
Персонажи перемещаются по карте, сражаются с монстрами, решают загадки — каждое из этих занятий имеет свой интерфейс, свою механику.
И, конечно же, все это добро загружается непосредственно во время игровой сессии — то есть нам было важно, чтобы «Эvolution» продолжала «летать» после переноса на новую платформу.
Самой большой проблемой, с которой мы столкнулись, было сохранение той же боевой производительности, что и игра на iOS. Для этого мы написали новые шейдеры, которые давали необходимый прирост скорости без существенного ухудшения изображения.
Нам даже удалось сохранить «честные» тени персонажей! Практически не было необходимости переделывать графические ресурсы (сцены, модели, анимацию).
Вторая большая (и еще более трудоемкая) часть работы — это 2D часть игры, которая в «Эvolution» даже больше, чем 3D. Тысячи разрешений экрана Android (по сравнению с несколькими на iOS) и отсутствие отличного формата сжатия текстур, такого как PVRTC (доступного на любом устройстве iOS), означают большую кропотливую работу.
«Эvolution» имеет десятки экранов, фонов, анимацию раскладывающихся книг и тысячи спрайтов, упакованных в десятки атласов.
Здесь нужно было что-то сжать, что-то растянуть, что-то переупаковать.
При всех изменениях, которые претерпевает графика во время порта, меняется и вес игры - в худшую сторону на Android. На iOS графика сжимается в 8 раз.
Есть совершенно замечательный алгоритм PVRTC4, который позволяет из 32-битной графики с альфа-каналом сделать 4-битную графику очень приличного качества.
Поскольку не всю графику на Android можно сжимать так же эффективно, как на iOS, она занимает больше места на диске.
Во многих местах требовалась ручная настройка; Несмотря на то, что мы выбрали общее решение, многое пришлось дорабатывать вручную.
Например, уже упомянутая проблема с разными экранами: мне пришлось учесть эту особенность Android и как-то решить ситуацию.
Конечно, нам не пришлось переписывать всё для каждого возможного экрана.
На iOS у нас было всего два масштаба, оба кратные двум — поэтому особых проблем с нарушением пропорций и размытием графики у нас не возникло.
Как правило, в Android берут некое среднее разрешение, а все остальное масштабируется под него.
Изменение разрешения в первую очередь влияет на двухмерную графику: в нашем случае это различные элементы интерфейса, кнопки и т. д. Мне приходилось прорабатывать эти детали вручную, сжимать текстуры, менять размеры графических элементов в основном интерфейсе.
Всего мы сделали четыре дистрибутива для «Эvolution».
Однако позже от одного из них нам пришлось отказаться — игра пока не поддерживает Tegra. Вообще портирование на Tegra, особенно старшего поколения, — это целое приключение.
Обычно, когда люди могут портировать 3D-игру с насыщенной графикой на Tegra, они затем идут куда-нибудь на профессиональную конференцию и рассказывают об этом.
Это изысканная и специфическая работа, когда разработчик добивается увеличения fps с 10 до 30 простым изменением порядка прорисовки различных объектов на экране.
Современные мобильные графические процессоры с высоты птичьего полета Все графические процессоры на рынке мобильных устройств работают по-разному.
Их можно разделить на 3 класса: тайловый отложенный рендеринг (TBDR) — PowerVR; тайловый рендеринг (TBR) — Adreno, Mali и рендеринг в немедленном режиме (IMR) — Tegra. PowerVR с его TBDR больше всего отличается от IMR, обычного настольного решения.
PowerVR работает так: он разбивает весь экран на небольшие тайлы размером 16х16 пикселей и рисует там всю геометрию, которая попадает в этот тайл.
Это происходит в сверхбыстрой памяти, расположенной внутри чипа.
В процессе рендеринга он отбрасывает все пиксели, которые не будут видны на конечном изображении (например, перекрыты другими непрозрачными объектами), а затем текстурирует и рассчитывает освещение только для тех пикселей, которые точно будут видны на экране.
На сегодняшний день это одно из самых экономичных и быстрых решений, и хотя оно имеет свой набор недостатков, с точки зрения разработчиков мобильных игр оно является самым оптимальным.
Из очевидных плюсов — он очень быстро делает альфа-смешивание, сглаживание, фильтрацию текстур и совершенно нечувствителен к порядку отрисовки непрозрачных объектов, мип-мэппингу и так далее, а замечательный формат сжатия PVRTC еще больше снижает нагрузку на память.
Другими словами, разработчикам не нужно ничего особенно оптимизировать — им просто нужно придерживаться определенного бюджета количества вершин, не злоупотреблять прозрачностью и не использовать альфа-тест, который нарушает весь процесс TBDR. IMR рисует все, используя лишь приблизительные оптимизации раннего Z-отсечения, поэтому очень чувствителен к порядку, в котором отрисовываются непрозрачные объекты.
Unity, к сожалению, здесь не может помочь — разработчик должен выяснить, какие объекты на сцене будут занимать больше места на экране, и указать Unity, чтобы они отрисовывались первыми (очередь рендеринга).
Поскольку все пиксели затенены, пиксельным шейдерам предстоит выполнить больше работы.
Чипы TBR работают почти так же, как IMR, но разбивают экран на плитки, чтобы уменьшить нагрузку на память.
NVIDIA продолжает выпускать новые типы, скоро появится Tegra K1, так что это довольно интересное направление, но, к сожалению, у нее совершенно другой подход, и из-за этого все равно будет некоторая разница при портировании.
Из мелких подробностей: например, если в iOS отключить мипмап на всех текстурах, то производительность падает на 2-3 фпс.
Если сделать это на Андроиде, то производительность падает на порядок.
Тонкостей очень много: если вы собираетесь оптимизировать игру под каждый из чипов, то будьте готовы к изучению толстых мануалов по оптимизации от производителей, долгому профилированию и экспериментам.
Кто-то делает эту работу, а потом читает доклад на конференции; Мы решили не копать так глубоко, а просто выбрали список устройств, для которых собираемся разрабатывать дистрибутивы, протестировали результат и загрузили в магазин удачные версии.
Увы, не каждый владелец Android-устройства сможет сыграть в «Эvolution», но мы «охватили» максимально возможное количество устройств.
Всего игру поддерживают около 1000 мобильных устройств Android. Вот и вся история.
Спасибо за внимание, если есть вопросы, задавайте их в комментариях, с удовольствием на них отвечу.
Теги: #игры #Разработка игр #Android #группа mail.ru #эволюция: битва за утопию
-
Восстановить Файл Excel
19 Oct, 24 -
Google Меняет Название На Топика
19 Oct, 24 -
Кикстартер – Год Игр
19 Oct, 24 -
Развитие Предметного Мышления У Учащихся
19 Oct, 24 -
Нашёл Ли Twitter Свою Бизнес-Модель?
19 Oct, 24