Эксперимент по разработке проекта от нуля до прибыли в непростых современных реалиях. Гайд по оптимизации
За прошлую заметку меня упрекнули в “много букав”, попробую кратко, разбив на несколько заметок.
Неделя выдалась непростой, поэтому заметка с опозданием. Ближайшие 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
Проект лучше начинать пустым с минимальными графическими настройками и увеличивать их по мере необходимости.
Так выглядят настройки в нашем проекте. Включаем Forward Render и Vulcan. Выключаем Mobile HDR.
Во вкладке Window – Developer Tools – Device Profile. Выбираем платформу Android. В открывшемся окне вкладка Render, в ней можно посмотреть (!) изменить все переменные, относящиеся к рендеру. Также их можно поменять через консоль при запуске проекта или непосредственно в Config/DefaultEngine.ini, но это не удобно.
Для создания окружения я использую 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 тенях количество полигонов на модель удваивается.
Регулярно тестируем собирая проект непосредственно под квест и проверяем производительность. На самом Квесте я использую OVR Metrics Tool. Для контроля draw calls и количества полигонов в редакторе запускаем проект в режиме Standalone Game и вводим консольную команду Stat RHI.
Следуя такому нехитрому гайду наше приложении работает при 72 fps на Quest 1 (больше он и не умеет) и при 90 fps на Quest 2.
В следующей заметке поговорим о визуале, алиасинге и сглаживании.
Решив все технические трудности, посмотрим, что непосредственно уже сделано, зададим сроки и попробуем начать создание страниц в сторах.
Информацию публикую раз в неделю по субботам. До встречи в следующей части и успехов! Stay Tuned!
Оглавление:
Часть 0 - Поставили задачу разработать приложение с нуля до вывода прибыли.
Часть 1 - Концепт и Диздок. Создаем приложение для знакомства с творчеством Брайона Гайсина (Brion Gysin) и его Dreamachine в VR!
Часть 2.1 - Оптимизация.
Часть 2.2 - Алиасинг и рендеринг
Почта для всякого: artem@bulletheadgames.com