Искать

7 шагов Олли по оптимизации VR для мобильных устройств

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

Кратко: быстрая оптимизация VR для мобильных устройств

Что нужно сделать как можно раньше

  • Включить статическое и динамическое пакетирование.
  • Выключить карты теней.
  • Выключить процедурный скайбокс и все освещение от скайбокса.
  • Выключить глобальное освещение во время работы приложения.
  • Запечь освещение от всех источников света.
  • Настроить все излучающие атрибуты шейдеров на запекание.
  • Привести карту освещения к стороне длиной 4096.

А что — позже

  • Использовать профайлер!
  • Рассчитать связь скелета с оболочкой (скиннинг) на CPU или GPU.
  • Проверять перерисовку (режим Overdraw в сцене или шейдер замены).
  • Использовать отладчик кадров для анализа очередности рендеринга.
  • При необходимости менять очередность рендеринга.
Постобработка ресурсами CPU

За счет чего можно увеличить производительность

  • Игровой процесс / физика / ИИ
  • Обработка компонентов Transform
  • Использование LOD (уровней детализации) и различных разрешений мешей для игровых объектов.
  • Отсечение: проверьте, есть ли объекты, которые отрисовываются раньше тех, что находятся за ними (таким образом закрываясь от камеры); проверьте, нет ли объектов, отрисовывать которые нет необходимости.

Unity-mobile-VR-optimization-occlusion-culling-overdraw-no-culling

Из документации по отсечению невидимых граней: обратите внимание, что в режиме Overdraw наблюдается большое количество объектов, перекрывающих друг друга. Движок отрисовывает все комнаты за пределами видимых стен. Зритель не видит эти комнаты, но они все равно отнимают ресурсы рендеринга.

Unity-mobile-VR-optimization-occlusion-culling-overdraw-reduced

При использовании отсечения движок не отрисовывает невидимые комнаты, перекрывающихся объектов становится гораздо меньше, а количество полигонов и пакетов сильно снижается без необходимости менять графику игры.

  • Динамическое пакетирование: если вам необходимо объединять объекты отрисовки, то используйте динамическое пакетирование — объединяйте похожие динамические объекты в сцене и собирайте их вместе для оптимизации потребления ресурсов.
  • Скиннинг на CPU
  • Отсечение по усеченной пирамиде видимости: определяйте все, что отрисовывается в этой области, в любой момент времени.
  • Настройте сортировку, то есть очередность отрисовки.

Как оптимизировать

  • Используйте CullingGroup API поможет определить отсекаемые объекты.
  • Оптимизируйте иерархию персонажа: есть даже специальный пункт для оптимизации всей скелетной сетки только до необходимых узлов, к которым нужно добавить объект Transform, скрипты и так далее.
  • Создайте группы LOD: загружайте меши различных уровней детализации с различными наборами текстур и материалами, задавая расстояние, на котором они должны загружаться в сцену.
  • Выключите сортировку, если вы понимаете, что это не сэкономит ресурсы на данном этапе.
  • И наконец, если вы не связаны ограничением вызовов отрисовки, то не используйте пакетирование.
Цикл рендеринга

За счет чего можно увеличить производительность

  • Каждый объект приходится отрисовывать дважды, по одному разу на каждый глаз.
  • Ресурсоемкость расчета карты теней.

Как оптимизировать

  • Включите функцию Single Pass Stereo, благодаря ей рендеринг будет выполняться не отдельно для каждого глаза, а с однобуферной прорисовкой и с переменными вызовами отрисовки для визуализации изображения для обоих глаз за один проход сцены.

Unity-mobile-VR-optimization-single-pass-stereo-rendering

Для включения этой функции необходимо выполнить следующее: откройте окно PlayerSettings (Edit > Project Settings > Player). В этом окне откройте вкладку Other Settings, отметьте пункт Virtual Reality Supported, а затем отметьте пункт Single-Pass Stereo Rendering под предыдущим пунктом.

  • Оптимизируйте ресурсы для расчета теней: уменьшите количество объектов, отбрасывающих тени и взаимодействующих с тенями; ограничьте расстояние прорисовки теней и каскады, а также выключите тени там, где это возможно.
  • Избегайте карт теней: используйте псевдотени или запеченные тени. Используйте декали, которые можно поместить в иерархию соответствующих объектов.
От CPU к GPU

За счет чего можно увеличить производительность

  • Избегайте изменения состояния в GPU во избежание прерывания цикла.
  • Постарайтесь сократить число манипуляций с материалами и картами освещения.
  • Проанализируйте группировку объектов в сцене.

Как оптимизировать

  • Объединяйте объекты, например, статические, чтобы они отрисовывались как один большой меш, а не несколько маленьких.
  • Собирайте как можно больше текстур и материалов в атласы для уменьшения числа вызовов отрисовки.
  • Лучше сделать несколько больших карт освещения на одну комнату или локацию, чем множество маленьких.
  • Используйте блоки атрибутов материала: измените элемент материала вместо полного выключения, получив при этом преимущество дублирования.

Unity-mobile-VR-optimization-GPU-Instancing

Для включения функции дублирования материалов в GPU выберите материал в окне Project, а затем в окне Inspector отметьте пункт Enable Instancing.

  • Используйте многопоточный рендеринг.
  • Работайте напрямую с Mesh API и отрисовывайте объекты непосредственно на экране. Это сложно, но если вы знаете, чего вы хотите и как этого добиться, то этот низкоуровневый API поможет вам добиться нужного результата.
Вершинная обработка

За счет чего можно увеличить производительность

  • Растеризация.
  • Сферические-гармонические источники света.
  • Вершинное освещение.
  • Скиннинг на GPU.

Как оптимизировать

  • Используйте меньше треугольных полигонов.
  • Используйте процессор для скиннинга, если графический процессор занят. Иными словами, используйте процессор для задач, которые можно перенести на CPU, освободив ресурсы графического процессора.
Фрагментная обработка

За счет чего можно увеличить производительность

  • Расчет карты теней.
  • Предварительный проход отложенного рендеринга освещения.
  • Карты освещения
  • Физический шейдинг.

Как оптимизировать

  • Уменьшите количество перерисовываемых пикселей для оптимизации производительности. Это означает, что необходимо учитывать, какие элементы перекрываются в сцене: полупрозрачные текстуры дыма и другие эффекты частиц, листва и другие объекты. Чем больше перекрывающихся объектов, тем меньше производительность.
  • Следите за очередностью рендеринга с помощью Material.renderQueue, чтобы знать, что отрисовывается и в каком порядке.
  • Используйте отладчик кадров для анализа очередности рендеринга, чтобы определить, что и когда отрисовывается в сцене, что впоследствии можно использовать для переопределения порядка и выявления элементов, которые вообще не требуют рендеринга.

Unity-mobile-VR-optimization-Frame-Debugger

Отладчик кадров Unity.

  • Избегайте прозрачных элементов, например, в листве, старайтесь сделать их геометрию как можно проще.
  • Подумайте, стоит ли использовать Standard Shader — он весьма требователен к ресурсам на мобильных устройствах. Вместо этого попробуйте воспользоваться шейдером Specular или другим шейдером, который лучше подходит для мобильных устройств.
Многопроходная обработка

За счет чего можно увеличить производительность

  • Карты теней.
  • Отложенное освещение.
  • Вершинное освещение.
  • Проход попиксельного освещения.

Как оптимизировать

  • Проверьте освещение в сцене, перекрываются ли источники света различными объектами. Распределите источники света, избегая перекрывания там, где это возможно, и вы сэкономите ресурсы.
  • Уменьшите дальность попиксельного освещения.
  • Задайте максимальное число источников, освещение которых рассчитывается попиксельно.
Обработка в экранном пространстве

За счет чего можно увеличить производительность

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

    • Цветокоррекция
    • Тон отображения
    • Bloom
    • AA
    • SSRR: отражения в экранном пространстве
    • SSAO: мягкие тени в экранном пространстве

Как оптимизировать

  • Используйте оптимизированный стек постобработки Unity совершенно бесплатно и сэкономьте! За кратким руководством по работе со стеком перейдите сюда. Кроме того, вы можете посмотреть доклад Кори Джонсона, где он подробно рассказывает о работе над каждым эффектом.

Unity-mobile-VR-optimization-post-process-image-stack

Новый стек постобработки Unity в действии.

  • Тщательно обдумывайте наложение эффектов, ведь каждый из них требует своих ресурсов. Идеальным вариантом будет ограниченное применение эффектов, но баланс вы должны найти самостоятельно.
Согласен

We use cookies to ensure that we give you the best experience on our website. Visit our cookie policy page for more information.