Разработка игры для веб и мобильных устройств на Unreal Engine 4 — советы евангелиста Epic Games
В марте этого года компания Epic Games анонсировала на Games Developers Conference ряд новых фич Unreal Engine и традиционно провела некоторое количество докладов. В этой статье мне хотелось бы уделить особое внимание одному из них, а именно презентации руководителя команды разработки платформы Джоша Адамса (Josh Adams) «Unreal Wherever You Go », посвященной мобильной и веб-разработке.
Тема актуальна как никогда, Unreal Engine 4 (UE4) вовсю используется в разработке для iOS и Android в midcore-жанре, а многие студии рассматривают UE4 для веб-разработки. В частности, это касается мультиплатформенных проектов.
После объявления о бесплатной модели распространения UE4 вокруг технологии и методов её применения в профессиональной среде возникло много вопросов. Материал подготовлен на основе данных из презентации на Games Developers Conference и дополнен некоторыми авторскими соображениями. Надеюсь, он сможет ответить на большую часть ваших вопросов.
О важности мобильной платформы
Сегмент мобильных игр заработал треть всех денег в рамках игровой индустрии в прошлом году и продолжает расти. Everything goes mobile. Растут объёмы, растёт производительность устройств, с ростом производительности расширяются возможности. Это позволяет использовать преимущества Unreal Engine в разработке по максимуму, как с точки зрения высококачественной графики, так и с точки зрения производства.
UE4 позволяет строить разработку проектов высокого качества небольшой группой разработчиков за счёт мощного инструментария (в частности, визуального скриптования посредством Blueprint), открытого исходного кода и постоянного роста комьюнити.
Однако совершенно ясно, что разработка для мобильных устройств и веба обладает своей уникальной спецификой. Помимо очевидных вопросов, связанных с памятью, потребляемой энергией и спецификой тач-интерфейса, мне хотелось бы подробно коснуться вопроса различия рендера UE4 для мобильных платформ, ПК и консолей.
Специфика рендера
- На мобильных устройствах используется так называемый форвард-рендеринг (forward render) или прямая визуализация. Его главное достоинство — это самый простой и легко реализуемый алгоритм визуализации. Программа визуализирует только то, что видит виртуальная камера в данный момент, поэтому просчет происходит быстро и занимает минимум памяти.
- Проводить стресс-тесты лучше на ранних стадиях разработки — при визуализации сцен со сложными шейдерами и освещением производительность может резко падать. Пост-процессы в мобильных системах также значительно упрощены в виду возможных ограничений производительности.
- Материалы при этом поддерживают PBR (Physically Based Rendering) и шейдинг, для их сборки используется тот же нодовый редактор. По сравнению с Unreal Engine 3 материалы в Unreal Engine 4 не имеют специальной мобильной ветки. Однако при создании материалов необходимо держать в голове тот факт, что GL ES2 имеет ряд ограничений, которые нужно учитывать при их построении.
- UE4 использует многоплатформенный транслятор стандарта HLSL, который позволяет транслировать шейдера в GLSL или Metal SL. На сегодняшний день стандартом является OpenGL ES2, но уже доступен OpenGL ES3.1, который расширяет стандарт ES2 и делает его значительно интереснее. Также существует известная проблема, связанная с тем, что программы, основанные на системе ES, сильно нагружают центральный процессор, но теперь у нас есть Metal, который переносит основную нагрузку на GPU.
В целом, мы крайне рекомендуем проведение полноценного препродакшена перед запуском полного цикла разработки. Стоит также выработать понимание, в какой из основных четырёх профайлов рендера, приведенных ниже, вы можете определить ваш проект.
- LDR (iPhone 4) — освещение и пост-процессы не используются, но при этом сохраняется полный доступ к редактору материалов.
- Basic (iPhone 4S) — можно использовать статичные источники света и некоторые пост-процессы.
- HDR (iPhone5S) — вычисления цвета и освещённости происходят при помощи чисел с плавающей точкой. Добавились тени, качество которых просчитывается в зависимости от расстояния до камеры.
- Desktop — рендеринг с поддержкой статичного и динамического освещения и физически корректного шейдинга.
Обычно уровень производительности выбирается по самому слабому устройству, которое вы хотите поддерживать, но помните о том, что всегда есть место для оптимизации и самостоятельному усовершенствованию модулей кода. Говоря о категоризации, стоит коснуться и вопроса масштабирования на разнообразные мобильные устройства, для чего используются профили.
В профиле устройств можно хранить настройки рендера под каждый гаджет отдельно или же под класс устройств со сходными параметрами. Для iOS задается профиль под каждое устройство. Для Android профили создаются по скорости обработки тайлов и/или по типу графического процессора.
- Общий принцип создания профиля.
- Задание общих параметров рендера.
- Настройка параметров для всех мобильных устройств.
- Добавление параметров, характерных для всех устройств каждой платформы.
- На основе базовой конфигурации iOS-платформы добавляются параметры для каждого iOS-устройства.
- На основе базовой конфигурации Android-платформы создаются профили для низкого, среднего и высокого качества.
- Добавление параметров для конкретного графического процессора.
Само собой, разработка под iOS и Android обладают своими особенностями.
Особенности разработки под разные платформы
Говоря об iOS, мы подразумеваем в некотором смысле «простую» платформу, даже несмотря на сложности с системами Provision-сертификатов и электронной подписи. Для более удобной работы с этими системами в UE 4.7 была добавлена возможность видеть список всех зарегистрированных сертификатов и подписей разработчика.
Проекты для iOS можно собирать как на компьютерах с Mac OS, так и на Windows. Само собой, в последних поколениях устройств от Apple добавлена новая графическая система Metal, которая позволяет поднять графику на совсем новый уровень. Говоря о работе с Metal, в голове стоит держать следующее:
- Использует более простой менеджер ресурсов.
- Поддерживает новую компрессию текстур ASTC (Adaptive Scalable Texture Compression), которая позволяет получить файлы текстур небольшого размера, но с высоким разрешением (требует процессор А8 и выше).
- Добавлена поддержка режима параллельного рендеринга, которая пока ещё не поддерживается в Unreal Engine 4, но в ближайших версиях поддержка появится.
- Имеет очень гибкую систему отладки и проверки в Xcode: просмотр ресурсов, перекомпиляция шейдеров «на лету», профилирование шейдеров и многое другое. Для поддержки Metal требуется набор предкомпиленных шейдеров, поэтому скомпилировать проект пока можно только на Mac OS.
- Всё ещё требует перехода на промежуточные языки программирования для окончательной сборки.
С Android всё намного сложнее из-за проблемы фрагментации по следующим категориям:
- CPU — ARM 32, ARM 64, x86, x64;
- GPU — Adreno, PowerVR, Tegra, Mali, которые, в свою очередь, используют различные компрессии текстур: ATITC, PVRTC, DXT, ETC1, ETC2, ASTC;
- версии ОС — 2.3 → 5.1.1;
- варианты ОС — Android, Amazon и так далее.
Это приводит к следующим проблемам совместимости:
- Компиляция шейдера — один и тот же шейдер может работать с ошибками или не работать вообще. Производитель может выпускать свою собственную версию компилятора шейдера, что-то менять от версии к версии, и из-за этого могут происходить сбои.
- Графический процессор может получать доступ к различному объёму памяти, что делает затруднительным оптимизацию.
- Сглаживание. Некоторые устройства поддерживают только восемь интерполяторов, а некоторые не могут просчитать и восьми.
- Неверные описания расширений в коде. Например, система говорит, что texCubeLodEXT существует, но, по факту, эта команда не работает.
Как же решить проблему совместимости?
- Избавиться от самых проблемных типов устройств. Оставить 10 базовых устройств с различными центральными и графическими процессорами. На остальных устройствах проверять дополнительно. Никогда не избавляйтесь от устаревших устройств.
- Использовать программы для автоматизации тестирования (AppThwack, TestDroid и другие). В этих программах уже занесены профили сотен устройств.
- На данный момент в разработке находится UE4 Readiness App — программа, показывающая параметры устройства. Приложение написано на Java и будет распространяться через Google Play.
- Добавление группы расширений GL ES3.1 — геометрический шейдер, ASTC текстуры и так далее.
Также, в качестве отдельного замечания, стоит помнить о том, что в Unreal Engine используется очень тонкий Java-клиент. Иногда возникает необходимость изменения некоторых исходников C++, но чаще всего этого можно избежать.
С точки зрения размера приложения для игр, объём которых превышает 50 Мб, используются специальные файлы ресурсов с расширением .obb. Amazon требует упаковывать всю игру в один .apk-файл, в настройках проекта перед упаковкой можно выбрать один из этих режимов. Сборка Android-версий на MacOS стала возможна с версии 4.7, собирать билд можно, не выходя из редактора.
Особенности разработки для web (HTML5)
Самый крутой момент состоит в том, что в UE4 используются решения без применения плагинов — только JavaScript. На текущий момент используется транслятор Emscripten, который конвертирует скомпилированный код С++ в ASM.JS. Полученный код в браузере может работать минимум с 50% скоростью от базовой. Без браузера (как самостоятельное приложение) скорость работы приложения зависит от JavaScript-компилятора.
Распределение памяти производится браузером, причём выделяется сразу нужный объём памяти. Это одна из проблем совместимости различных браузеров. Браузеры для 64-битных систем могут спокойно запускать проекты, а вот 32-битные иногда испытывают трудности.
Текущий графический стандарт для HTML5 — это WebGL, который совместим со стандартом OpenGL ES2. Разные браузеры имеют разные расширения для поддержки этого стандарта. Преимущество перед мобильными системами в том, что есть возможность максимально использовать вычислительные мощности настольной системы.
Новый стандарт WebGL 2 будет совместим с ES3.0. В данный момент разработка продолжается.
Виртуальная файловая система позволяет значительно увеличить скорость работы с файлами, но требует очень большого количества оперативной памяти. Emterpreter — это транслятор, который позволяет переводить из кода C++ в JavaScript и обратно. Он также способен интерпретировать асинхронный код, как синхронный. Не требуется предзагрузка контента. Поддержка этого расширения пока только анонсирована и находится в разработке.
Проекты на HTML5 работают практически во всех браузерах, но нужны дополнительные сессии тестирования, так как разные браузеры имеют различные расширения и по-разному используют память.
32-битные браузеры не могут выделять большой объём памяти, поэтому нужно использовать в основном 64-битные версии. Игры для HTML5 пользуются большим спросом, и внедрение Emterpreter поможет минимизировать многие неудобства.
Планы на будущее
Unreal Engine 4 продолжает активно развиваться на мобильные и веб-платформы, уже в ближайшее время выйдет версия 4.8, будут заявлены новые фичи в этом направлении, продолжается работа по поддержке Metal MRT, оптимизация, добавление новой функциональности.
Если вы рассматриваете Unreal Engine 4 как технологию для разработки своего следующего проекта, но у вас есть какие-либо технические вопросы, задавайте их здесь. Если у вас есть какие-либо вопросы общего характера, вы также можете написать мне по адресу aleksey.savchenko@epicgames.com.
Чтобы написать колонку для ЦП, ознакомьтесь стребованиямик публикуемым материалам.