Разработка
Разработка
Выберите платформу

Рекомендации по оптимизации производительности VR-приложений

LINK PC-VR DOCUMENTATION
Эта тема посвящена разработке с использованием PC SDK. Об оптимизации производительности для приложений Meta Quest на разных платформах см. в следующих статьях:
В этом разделе рассматриваются общие принципы, которых следует придерживаться для эффективной оптимизации VR-приложений.

Обзор

Оптимизация VR-приложений может оказаться непростой задачей. Легко пойти по неверному пути и оптимизировать код, который не улучшит общую производительность приложения. Важно определить узкие места и оптимизировать в первую очередь их.
Проблемы с производительностью VR-приложений обычно бывают двух типов: проблемы с ЦП и проблемы с ГП. ЦП, как правило, занимается логикой симуляции, управлением состоянием и созданием сцены для рендеринга. ГП занимается выборкой текстур и затенением сетки в сценах. Важно определить, связана ли проблема производительности с нагрузкой на ЦП или ГП, и оптимизировать код соответствующим образом.
В целом, при параллельном программировании нужно следовать закону Амдала: оптимизируйте те участки, которые больше всего загружают систему. Сосредоточьтесь на самых затратных участках кода. В этом документе содержатся рекомендации, как их определить. Не концентрируйтесь на проблемах, которые позволят добиться лишь незначительного снижения общих затрат на производительность, даже если вы сократите эти затраты почти до нуля.
Часто одна область в приложении использует большой процент времени работы системы, в то время как остальные области потребляют гораздо меньший процент. В первую очередь следует оптимизировать наибольшую проблемную область.
При оптимизации приложения старайтесь менять по одному сегменту за раз. Помните, что между внесенными изменениями могут быть нетривиальные взаимодействия, особенно в сложных VR-приложениях. Если вы видите снижение производительности в своем приложении, постарайтесь найти в истории программы для контроля версий то единственное изменение, которое вызвало проблему производительности. Затем попробуйте найти там первопричину проблемы производительности. Не стоит предполагать, что одну проблему производительности вызывают несколько изменений.
Часто мы уделяем излишне много внимания деталям, которые не имеют значения с точки зрения итоговой производительности. Обычно лучше просто рассмотреть вопросы синхронизации: попадает ли приложение в частоту кадров? Если да, то, возможно, вам не нужно дополнительно оптимизировать его, даже если код разработан не так хорошо, как хотелось бы. Сосредоточьтесь на том, что действительно важно с точки зрения проблем производительности, которые влияют на пользовательский опыт.

Способы повышения частоты кадров

Обычно в VR-приложениях каждый кадр должен быть отрисован дважды: по одному разу для каждого глаза. Это означает, что каждый вызов отрисовки выполняется дважды, каждая сетка рисуется дважды и каждая текстура привязывается дважды. Кроме того, небольшое количество накладных расходов требуется для применения искажений и TimeWarp к конечному выходному кадру (примерно 2 мс на кадр). Поскольку Rift обновляет кадры с частотой 90 Гц, получить стабильную частоту кадров может быть непросто.
Следующие общие рекомендации помогут вам добиться нужной частоты кадров.
  • Ограничьте каждый кадр максимум 500–1 000 вызовами отрисовки.
  • Ограничьте каждый кадр максимум 1–2 миллионами треугольников или вершин.
  • Используйте как можно меньше текстур (при этом они могут быть большими). Меньшие рабочие наборы, сжатие текстур и текстурирование позволят свести к минимуму потребление пропускной способности текстурами.
  • Ограничьте время выполнения скрипта (или другой логики) до 1–3 мс, например при запуске Unity Update().
  • Системы могут работать непредсказуемо, поэтому всегда запускайте профилировщик, чтобы понять, как приложение использует ресурсы.
  • Не проводите оптимизацию на самых ранних этапах процесса разработки. Сначала упростите код. И наоборот, не игнорируйте очевидные проблемы с производительностью, когда вы их обнаружите.
  • Не полагайтесь на непроверенные технологии или методы, об эффективности которых ничего не известно.
  • Всё относительно. Сравнивайте теплое с теплым.
  • Меняйте что-то одно за раз: разрешение, аппаратные ресурсы, качество изображения и т. д.
  • Некоторые артефакты могут быть хуже других. Потерянные кадры, вызывающие дискомфорт, не стоят более качественной графики.
  • Не полагайтесь на асинхронное искажение пространственно-временной шкалы (ASW) для достижения частоты кадров рендеринга. Если ваше приложение начинает терять кадры, ASW генерирует промежуточные кадры на основе последней информации о положении головы. Он работает путем искажения предыдущего кадра в соответствии с более новым положением головы. Иногда ASW помогает сгладить некоторые потерянные кадры, однако приложения должны стабильно обеспечивать 90 кадров в секунду (FPS) на машине с рекомендуемыми характеристиками и поддерживать 45 кадров в секунду на машине с минимальными характеристиками, чтобы получить право на продажу в Rift Store.
  • Благодаря более высокому разрешению и нагрузке на ГП, ЦП, как правило, не относится к узким местом в Rift по сравнению с мобильными VR-устройствами.
  • Графические стили с простыми шейдерами и относительно небольшим количеством полигонов часто могут обеспечить не меньший эффект от VR-приложения, чем фотореалистичная графика, которая обычно требует значительно больше обработки для рендеринга каждого кадра.
  • Используйте такие приемы, как уровень детализации (LOD), отбрасывание и пакетная обработка.
  • Сократите скорость затенения за счет масштабирования глазных буферов и использования окталинейного рендеринга (который использует NVIDIA Lens Matched Shading).
  • Используйте проекционные тени для экономии пропускной способности.
  • Учитывайте разрешение и количество каскадов, которые вы используете при рендеринге в каскадную карту теней, поскольку они могут требовать большей пропускной способности. Кроме того, старайтесь не использовать дорогостоящую фильтрацию. Однако уменьшение разрешения и количества каскадов может быстро привести к снижению качества графики, поэтому также рассмотрите использование проекционных теней.
  • При необходимости используйте упрощенную математику шейдеров и запеченные тени.

Основные причины проблем с производительностью

Проблемы с производительностью чаще всего возникают из-за следующих проблем (степень серьезности в порядке убывания):
ПроблемаЗатрачиваемые ресурсы
Сцены, требующие зависимого рендеринга, в том числе тени и отражения
ЦП, ГП
Привязка объектов вершинного буфера для выполнения вызовов отрисовки
ЦП, драйвер видеокарты
Прозрачность, многопроходные шейдеры, попиксельное освещение и другие эффекты, заполняющие большое количество пикселей
Графический процессор (ГП)
Загрузка больших текстур, передача блоков битов и другие виды memcpy
ГП, контроллер памяти
Анимация со скинами
ЦП, ГП
Накладные расходы на сбор мусора в Unity
Центральный процессор (ЦП)
Логотип навигации
Русский
© 2026 Meta