Как опубликовать VR-игру в Oculus без нервного срыва
Мы продолжаем делиться нашим первым опытом разработки VR-игры Astro Collapse. В предыдущих статьях я рассказал об основной идее игры и геймдизайне.
В этот раз мы расскажем, как избежать наших ошибок и опубликовать игру быстрее. У нас получилось это только с третьей попытки, потому что мы застряли на технической проверке. Нам не удалось повысить производительность игры, используя только советы с сайта Oculus. Поэтому решения мы искали сами. Дочитайте статью до конца, чтобы не налажать с публикацией игры в Oculus. Возможно, у вас получится это с первого раза.
Технические рекомендации к VR-играм и основные показатели производительности
Когда вы сделаете готовый билд, зарегистрируйтесь в Oculus и загрузите игру в личный кабинет. Через несколько дней вам на почту придёт уведомление. Это будет либо поздравление с успешным прохождением теста, либо просьба исправить ошибки.
В первый раз мы не учли всех рекомендаций с сайта Oculus, поэтому получили вот такой результат:
Мы провалили тест на производительность, у нас была проблема с требуемым возвратом в меню Oculus Home и игра не устанавливалась на старшие версии Android.
Чтобы пройти тест на производительность, нужно следовать следующим рекомендациям:
- FPS в игре должен быть не меньше 60;
- от 50 до 100 вызовов отрисовки на кадр (Call Draw);
- 1-3 миллисекунды на выполнение скриптов;
- от 50 000 до 100 000 полигонов на кадр.
Разберёмся сначала с понятиями, а затем я расскажу, как мы решили наши проблемы с производительностью.
FPS или количество кадров в секунду
Ключевой показатель высокой производительности — высокий FPS. Он показывает частоту сменяемости кадров в секунду: в игре есть цикл, который прорисовывает игровой мир и выполняет математические операции в скриптах. Чем выше задержка между этими кадрами, тем ниже показатель и производительность.
С помощью FPS можно понять, всё ли в порядке с игрой.
Показатель Draw Call
Draw Call — количество вызовов текстур, которые игровой движок отправляет графическому процессору для отрисовки мира. Чтобы сократить число вызовов, движку необходимо объединить текстуры в один материал. Этот приём называется батчинг (batching).
Чем выше показатель Draw Call, тем больше времени уходит на прорисовку игрового мира.
Скрипты и скорость их выполнения
Скрипты отвечают за любые действия и операции в игре. Чтобы их выполнять, нужны обработчики. Например, Update. Он должен обрабатывать каждый кадр. Если в игре много объектов и сложных действий над ними, то этот обработчик не успевает завершать кадр. Поэтому производительность низкая, а игра виснет.
Много длительных операций в Update усложняют выполнение действий над объектами.
Полигоны на кадр
Полигоны — это треугольники, из которых состоят трёхмерные игровые модели. Они складываются из вершин и плоскостей. Число полигонов на кадр — произведение количества всех объектов в игровом мире и этих треугольников.
Чем выше это число, тем дольше игровой движок будет обрабатывать один кадр.
Как мы решили проблемы с производительностью
У нас были 4 основные проблемы, из-за которых производительность в игре не дотягивала до рекомендуемых значений. Мы сделали слишком детализированные трёхмерные объекты, столкнулись с высоким показателем Draw Call, скрипты тормозили, а память устройства была перегружена. На поиск решений этих недочётов мы потратили больше всего времени. А теперь обо всём по порядку.
Упрощаем трёхмерные объекты и понижаем полигоны на кадр
В нашей игре много астероидов и кораблей, которые постоянно двигаются и перегружают игру. Во время сражения игрок не успевает их рассматривать и обращать внимание на детализацию, потому что он увлечён процессом. Если уменьшить количество астероидов, то игра станет скучной и неинтересной. Поэтому мы решили упростить трёхмерные модели астероидов и шаттлов: уменьшили общее число полигонов в игровой сцене.
Определите, что важно в вашей игре: детализация мелких объектов или большой игровой мир. Вы поймёте, какие модели объектов не нужно детализировать, что поможет повысить производительность.
Объединяем текстуры в атласы и добиваемся рекомендуемого показателя Draw Call
В Astro Collapse игровой мир создан из астероидов, шаттлов, боевых кораблей, Земли и Солнца. Объектов в игре много — показатель Draw Call был высоким, поэтому движок тормозил прорисовку графики. Чтобы его снизить, нужно объединить разные текстуры объектов в один атлас.
Мы сделали 4 больших атласа текстур: для астероида, кабины и пушек, интерфейса прицелов, игрового меню. Это объекты, которые состояли из множества схожих материалов. Атласы упростили работу движку, потому что ему больше не требовалось собирать разные текстуры в один объект — мы сделали это за него.
Собирайте материалы объектов в атлас — одну большую текстуру.
Сокращаем время выполнения скриптов
Любое действие в игре происходит с помощью скриптов. В Astro Collapse множество игровых объектов и сложных операций над ними, поэтому часть скриптов выполнялась долго — обработчик Update задерживал завершение кадра. Это тормозило игровые процессы.
Поэтому нам нужно было вынести сложные операции из покадрового обновления. Мы использовали обработчик корутин (co-routine), который умеет выполнять такие операции над объектами вне кадра.
Так нам удалось оптимизировать сложные операции работы с астероидами. В Astro Collapse таких объектов много: каждый астероид нужно проверять на активность, следить за его местоположением в космосе и вносить его в список. Сам список нужно обновлять, чтобы выводить в игру новые астероиды, рассчитывать их расстояние до игрока, шаттлов и соседних боевых кораблей. В итоге получается долго выполняемый цикл для кадра, с которым обработчик Update не справлялся. А при помощи корутина движок вынес эту сложную операцию из покадрового обновления и повысил производительность.
Обработчик co-routine выполняет сложные операции вне покадрового обновления, чем упрощает работу игровому движку.
Защищаем память устройства от мусора и делаем пул астероидов
В Astro Collapse очень много астероидов. Они постоянно появляются, их нужно уничтожать. Стандартные конструкторы в скрипте Instantiate и Destroy не справляются, выполняя эти операции. Они создают мусор в памяти устройства, из-за чего игра виснет. Поэтому мы сделали по-другому.
Сбитые астероиды не уничтожаются, а скрываются в игровом пространстве. Когда требуется новый объект, скрипт вызывает его из спрятанных. Этот метод называется пулом.
Перед загрузкой игрового мира скрипт создаёт несколько десятков астероидов. Если все они одновременно летят в космосе и в памяти их нет, то он производит новый астероид и добавляет его в список. Так мы получили гибкую модель управления астероидами и повысили производительность игры.
Используйте метод пула для однотипных объектов, которые часто создаются и уничтожаются, но в самой игре одновременно их немного.
Небольшие недочёты после технической проверки
Постобработка моделей в игре: отключаем антиалиасинг
Антиалиасинг — постобработка изображения сглаживанием зазубренных краев. В Astro Collapse антиалиасинг был установлен по умолчанию. Он перегружал игру, а заметного сглаживания в игре всё равно не было — разрешение в шлеме Gear VR невысокое. Поэтому мы его отключили. Игроки при тестировании не заметили изменений, но производительность стала выше.
Антиалиасинг не даёт сглаженной картинки при низком разрешении Gear VR.
Зрелищные взрывы из спрайтов
Чтобы сделать яркие взрывы, мы использовали спрайты. Это картинка-взрыв, которая меняет свой размер, прозрачность и цвет из красно-оранжевого в чёрный. Так нам удалось сохранить динамичность взрыва и повысить производительность игры, не используя сложные системы множества отдельных частиц и анимацию.
Зрелищные взрывы можно сделать с помощью спрайтов.
Тени не нужны
Мы отключили тени, потому что игра всегда в постоянном движении — их не видно. Кроме этого у нас не было крупных объектов, на которые можно было бы отбрасывать тень.
Отключайте тени для второстепенных объектов игры, которые незначительны для игроков.
Проблема с требуемым возвратом в меню Oculus Home
Кнопка возврата на шлеме должна возвращать игрока в Oculus Home, а не в меню игры, как было в Astro Collapse. Чтобы исправить этот недочёт, я взял готовый скрипт плагина Oculus и применил его в игре.
Используйте скрипт OVRPlatformMenu.cs, чтобы кнопка возврата меню работала правильно.
Устранение недочёта с установкой игры на старшие версии Android
Недочёт с установкой решить легко. Нужно указать в настройке проекта старшую поддерживаемую версию Android
Не забудьте в настройках игры указать минимальный требуемый уровень API Android 4.1.
Результаты после публикации игры
Мы исправили наши недочёты и отправили игру на проверку в третий раз. Ответ был положительным — игру опубликовали через неделю:
Через 2 недели после публикации Astro Collapse скачали более 7000 раз. Для VR-игр на платформе Gear VR это отличный результат: она вошла в топ-50 бесплатных игр и заняла 24 позицию в списке.
Советы для публикации игры в Oculus
Соблюдайте несколько правил, чтобы избежать наших проблем при публикации игры в магазин Oculus:
- Изучите рекомендации и самые распространенные проблемы на официальном сайте Oculus, прежде чем выкладывать игру.
- Думайте о повышении производительности с самого начала разработки, чтобы на финальном этапе не переделывать всю игру.
- Не усложняйте графику в игре детализацией всех объектов, множеством текстур или тенями. Её будут запускать на мобильных телефонах, а их технические характеристики ограничены. Подумайте, что можно убрать без потери качества игры.
- Пишите в техническую поддержку Oculus. Они быстро ответят и помогут.
- Помните, что повышение производительности каждой игры требует индивидуального подхода разработчика. Вы не найдёте универсального решения проблемы.
Наши советы помогут пройти проверку в Oculus быстрее.
Сыграйте в игру Astro Collapse и оцените графику. Для этого вам понадобятся очки Samsung Gear VR. Они работают со смартфонами: Samsung Galaxy Note 4, 5, 7, S6/S6 Edge/S6 Edge+, S7/S7 Edge, S8/S8+.
Успешных разработок!