Уменьшить рендеринг работы на CPU или GPU
На этой странице содержатся некоторые простые рекомендации по оптимизации производительности отображения в приложении.
Прежде чем начать: обнаружить и понять проблему
Прежде чем вносить какие-либо изменения, необходимо пропрофилировать приложение, чтобы определить причину проблемы. Если вы попытаетесь решить проблему производительности до понимания ее причины, вы можете потерять время или ухудшить проблему. Кроме того, проблемы производительности, связанные с отображением, могут возникнуть на CPU или GPU. Стратегии устранения этих проблем совершенно разные, поэтому важно понять, в чем заключается проблема, прежде чем предпринимать какие-либо действия.
Следующая статья на сайте Unity Learn является всеобъемлющим введением в производительность графики и содержит информацию о выявлении и устранении проблем: Устранение проблем с производительностью. Если вы еще не знакомы с этой темой, прочитайте статью, прежде чем следовать каким-либо советам на этой странице.
Снижение стоимости CPU рендеринга
Обычно наибольшее влияние на время рендеринга на CPU оказывает стоимость отправки команд рендеринга на GPU. К командам рендеринга относятся вызовы отрисовки (команды нарисовать геометрию) и команды изменения настроек GPU перед отрисовкой геометрии. Если дело в этом, рассмотрите следующие варианты:
- Вы можете уменьшить количество объектов, которые Unity рендирует.
- Рассмотрите возможность уменьшения общего количества объектов в сцене: например, используйте skybox для создания эффекта удаленной геометрии.
- Проводить более строгий убой, с тем чтобы Unity рисует меньше объектов. окклюзионный клининг для предотвращения Unity от рисования объектов, которые скрыты за другими объектами, уменьшая дальнюю плоскость клипа Camera так, что более отдаленные объекты попадают за пределы его фрустум, или, для более мелкозернистого подхода, помещая объекты в отдельные слои и установление расстояний отсечения по слоям с Camera.layerCullDistances.
- Вы можете уменьшить количество раз, когда Unity отображает каждый объект.
- Используйте lightmapping (отображение света) для «запекания» (предварительного вычисления) освещения и теней, где это необходимо. Это увеличивает время сборки, использование памяти при выполнении и пространство для хранения, но может улучшить производительность при выполнении.
- Если в приложении используется отображение вперед, уменьшите число светодиодов реального времени на пиксель, которые влияют на объекты. Дополнительные сведения см. в Путь отображения вперед.
- Тени реального времени могут быть очень ресурсоемкими, поэтому используйте их экономно и эффективно. Дополнительные сведения см. в Устранение неполадок теней: производительность теней.
- Если в вашем приложении используются отраженные зонды, убедитесь, что вы оптимизировали их использование. Дополнительные сведения см. в Производительность отраженных зондов
- Вы можете уменьшить количество работы, которую Unity должен выполнять для подготовки и отправки команд рендеринга, обычно отправляя их в GPU более эффективными «батчами». Существует несколько способов достичь этого: для более подробной информации см. Оптимизация вызовов отрисовки.
Многие из этих подходов также уменьшат работу, требуемую на GPU; например, уменьшение общего количества объектов, которые Unity рендирует в кадре, приведет к уменьшению рабочей нагрузки как на CPU, так и на GPU.
Снижение стоимости GPU рендеринга
Существуют три основные причины, по которым GPU может не завершить свою работу вовремя для рендеринга кадра.
Если приложение ограничено скоростью заполнения, то GPU пытается нарисовать больше пикселей в кадре, чем он может обработать. Если это так, рассмотрите следующие варианты:
- Выявление и уменьшение перерисовки в вашем приложении. Наиболее распространенными причинами перерисовки являются перекрывающиеся прозрачные элементы, такие как UI, частицы и спрайты. В Unity Editor используйте режим Режим отрисовки Overdraw для выявления областей, где это является проблемой.
- Снижение стоимости выполнения шейдеров фрагментов. Информацию о производительности шейдеров см. на странице Shader Performance.
- Если вы используете встроенные шейдеры Unity, выберите те из категорий Мобильные или Неосвещённый. Они также работают на немобильных платформах, но являются упрощенными и приближенными версиями более сложных шейдеров.
- Динамическое разрешение является Unity функция, которая позволяет динамически масштабировать отдельные цели рендеринга.
Если приложение ограничено пропускной способностью памяти, GPU пытается прочитать и записать больше данных в выделенную память, чем оно может обработать в кадре. Это обычно означает, что текстур слишком много или текстуры слишком большие. Если это так, рассмотрите следующие варианты:
- Включите mipmaps для текстур, расстояние от камеры которых меняется во время выполнения (например, большинство текстур, используемых в сцене 3D). Это увеличивает использование памяти и пространства для хранения для этих текстур, но может улучшить производительность GPU во время выполнения.
- Используйте соответствующий форматы сжатия для уменьшения размера текстур в памяти. Это может привести к более быстрой загрузке, меньшей нагрузке на память и улучшению GPU Сжатые текстуры используют лишь часть пропускной способности памяти, необходимой для несжатых текстур.
Если приложение ограничено обработкой вершин, это означает, что GPU пытается обработать больше вершин, чем оно может обработать в кадре. Если это так, рассмотрите следующие варианты:
- Снижение стоимости выполнения вершинных шейдеров. Информацию о производительности шейдеров см. на странице Shader Performance.
- Оптимизируйте геометрию: не используйте больше треугольников, чем необходимо, и старайтесь держать количество UV отображающих швов и жестких рёбер (двойных вершин) на как можно более низком уровне. Для более подробной информации см. Создание моделей для оптимальной производительности.
- Используйте Уровень Детали системы.
Сокращение частоты рендеринга
Это не уменьшает затрат CPU или GPU на рендеринг одного кадра, но уменьшает частоту, с которой Unity выполняет это, не влияя на частоту других операций (таких как выполнение скриптов).
Вы можете уменьшить частоту кадров рендеринга для части приложения или для всего приложения. Уменьшение частоты кадров рендеринга предотвращает ненужное потребление энергии, продлевает срок службы батареи и предотвращает повышение температуры устройства до точки, когда частота CPU может быть ограничена. Это особенно полезно для портативных устройств.
Если профилирование показывает, что рендеринг занимает значительную долю ресурсов приложения, подумайте, какие его части от этого выиграют. Типичные случаи: меню и экраны паузы, пошаговые игры, ожидающие ввода, и приложения с преимущественно статичным содержимым — например, автомобильные интерфейсы.
Чтобы предотвратить задержку ввода, вы можете временно увеличить частоту кадров рендеринга на время ввода, чтобы она оставалась чувствительной.
Для настройки частоты кадров рендеринга используйте OnDemandRendering API. API работает особенно хорошо с Адаптивная производительность.
Примечание: VR-приложения не поддерживают On Demand Rendering. Если отрисовывать не каждый кадр, изображение рассинхронизируется с движениями головы, что может повысить риск укачивания.
Дополнительные ресурсы
- Уменьшить рендеринг работы на GPU или CPU в URP
- Оптимизировать для не связанных XR устройств в URP
- Рендирование графики: достижение наилучшей производительности с помощью Unity 6
- Советы и рекомендации по производительности от консультанта Unity