Эксперимент по разработке проекта от нуля до прибыли в непростых современных реалиях. Гайд по оптимизации

За прошлую заметку меня упрекнули в “много букав”, попробую кратко, разбив на несколько заметок.

Неделя выдалась непростой, поэтому заметка с опозданием. Ближайшие 3 публикации будут с небольшим техническим уклоном, поскольку началась непосредственно разработка - сейчас поговорим про оптимизацию - определим на что обращать внимание в общем целом при создании нашего интерактивного пространства. Далее коснемся очень важной визуальной составляющей - сглаживании и, наконец, перейдем к тому, что непосредственно было создано для проекта - разные интерактивные и просто красивые штуки).

Поехали.

Основные технические проблемы при разработке я вижу две:

  • Производительность
  • Сглаживание

Разберем от общего к частному на примере нашего проекта.

Производительность.

Проект для Oculus Quest то есть должен примерно (примерно!) соответствовать критериям:

As a guideline, we suggest developers target 300,000 to 500,000 triangles on Quest 1 and 750,000 to 1,000,000 on Quest 2

150-250 Draw Calls

developer.oculus.com

Проект лучше начинать пустым с минимальными графическими настройками и увеличивать их по мере необходимости.

Так выглядят настройки в нашем проекте. Включаем Forward Render и Vulcan. Выключаем Mobile HDR.

Во вкладке Window – Developer Tools – Device Profile. Выбираем платформу Android. В открывшемся окне вкладка Render, в ней можно посмотреть (!) изменить все переменные, относящиеся к рендеру. Также их можно поменять через консоль при запуске проекта или непосредственно в Config/DefaultEngine.ini, но это не удобно.

Console Variables
Console Variables

Для создания окружения я использую 3 мастер материала. Благодаря этому продолжительность рендера сцены хорошо прогнозируема.

В материалах стараемся использовать минимум текстур с минимально достаточным разрешением всегда в степени двойки (не более 2048x2048), не использовать прозрачных материалов. Отключаем отражения в тех материалах, где они не нужны проставляя галочку Fully Rough - это сильно удешевляет материал.

При сложной развертке ставим галочку Use Full Precision, иначе текстура будет выглядеть пиксельной или может вообще уехать в сторону.

Примерно проверяем сложность материалов на сцене переключив режим изображения на Shader Complexity (Alt+8).

Материал
Материал

Освещение, за очень редким исключением, используем Static. Настройки ставим какие нравятся исходя из визуальных предпочтений. Разрешение карт теней - минимальное, но достаточное. Оно не обязательно должно быть в степени двойки, анрил сам потом формирует из них атлас.

Модели максимально используем Static Mesh, никаких BSP и минимально Skeletal Mesh. Каждый дополнительный материал на модели – это +1 draw call. Через это стараемся запекать всё в одну текстуру.

Ограничения: 65k vertices в статик меше и 75 костей в Skeletal Mesh.

Используем систему LODов. Для любого меша (даже Skeletal (!)) можно автоматически создать лоды - обязательно (обязательно!) их создаем и настраиваем дальность. Помним про бюджет полигонов в кадре. При movable тенях количество полигонов на модель удваивается.

Настройка LODов
Настройка LODов

Регулярно тестируем собирая проект непосредственно под квест и проверяем производительность. На самом Квесте я использую OVR Metrics Tool. Для контроля draw calls и количества полигонов в редакторе запускаем проект в режиме Standalone Game и вводим консольную команду Stat RHI.

OVR Metrics Tool
OVR Metrics Tool

Следуя такому нехитрому гайду наше приложении работает при 72 fps на Quest 1 (больше он и не умеет) и при 90 fps на Quest 2.

В следующей заметке поговорим о визуале, алиасинге и сглаживании.

Решив все технические трудности, посмотрим, что непосредственно уже сделано, зададим сроки и попробуем начать создание страниц в сторах.

Информацию публикую раз в неделю по субботам. До встречи в следующей части и успехов! Stay Tuned!

Оглавление:

Часть 0 - Поставили задачу разработать приложение с нуля до вывода прибыли.

Часть 1 - Концепт и Диздок. Создаем приложение для знакомства с творчеством Брайона Гайсина (Brion Gysin) и его Dreamachine в VR!

Часть 2.1 - Оптимизация.

Часть 2.2 - Алиасинг и рендеринг

Почта для всякого: artem@bulletheadgames.com

2828
5 комментариев

Я почему-то думал, что при разработке оптимизоном занимаются в последнюю очередь. Под VR, видимо, своя специфика?

Ответить

Когда точно знаешь характеристики платформы, на которую разрабатываешь, лучше, с моей точки зрения, да и эпики неоднократно об этом говорили на стримах, задать себе производственный пайплайн заранее. В VR просадка кадров, даже кратковременная, не приветствуется.

2
Ответить

Вот хороший пример. И там проект на "компьютерный" VR, не мобильный как у нас, с еще большими ограничениями в производительности.
https://ue4daily.com/blog/Witching-Tower-VR

1
Ответить

А в чём преимущества Forward-рендера в сравнении с deferred?

Ответить