Чтобы отрисовать геометрию на экране, Unity отправляет вызовы отрисовки графическому API. Вызов отрисовки сообщает графическому API, что и как рисовать. Каждый вызов отрисовки содержит всю информацию, необходимую графическому API для рисования на экране, например информацию о текстурах, шейдерахпрограмме, которая работает на графическом процессоре. Подробнее
См. в Словарь и в буферах. Вызовы отрисовки могут быть ресурсоемкими, но часто подготовка к вызову отрисовки требует больше ресурсов, чем сам вызов отрисовки.
Чтобы подготовиться к вызову отрисовки, ЦП настраивает ресурсы и изменяет внутренние настройки графического процессора. Эти параметры вместе называются состоянием рендеринга. Изменения состояния рендеринга, например переключение на другой материал, являются наиболее ресурсоемкими операциями, выполняемыми графическим API.
Поскольку изменения состояния рендеринга требуют больших ресурсов, важно оптимизировать их. Основной способ оптимизировать изменения состояния рендеринга — уменьшить их количество. Это можно сделать двумя способами:
- Сократите общее количество вызовов отрисовки. Когда вы уменьшаете количество вызовов отрисовки, вы также уменьшаете количество изменений состояния рендеринга между ними.
- Организуйте вызовы отрисовки таким образом, чтобы сократить количество изменений состояния рендеринга. Если графический API может использовать одно и то же состояние рендеринга для выполнения нескольких вызовов отрисовки, он может группировать вызовы отрисовки вместе, и ему не нужно выполнять столько изменений состояния рендеринга.
Оптимизация вызовов отрисовки и изменений состояния рендеринга имеет ряд преимуществ для вашего приложения. В основном это улучшает время кадра, но также:
- Снижает количество электроэнергии, требуемой вашему приложению. Для устройств с батарейным питанием это снижает скорость разряда батарей. Это также снижает количество тепла, выделяемого устройством при работе вашего приложения.
- Улучшает ремонтопригодность вашего приложения в будущем. Когда вы оптимизируете вызовы отрисовки и изменения состояния рендеринга раньше и поддерживаете их на оптимизированном уровне, вы можете добавить больше GameObjectsфундаментальный объект в сценах Unity, которые могут представлять персонажей, реквизит, декорации, камеры, путевые точки и многое другое. Функциональность GameObject определяется прикрепленными к нему компонентами. Подробнее
См. Словарь для вашего sceneСцена содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
См. в Словарь без существенного снижения производительности.
Есть несколько методов, которые вы можете использовать в Unity для оптимизации и уменьшения количества вызовов отрисовки и изменений состояния рендеринга. Некоторые методы больше подходят для определенных сцен, чем другие. В Unity доступны следующие методы:
-
GPU Instancing: рендеринг нескольких копий одной и той же сетки Основной графический примитив Unity. Меши составляют большую часть ваших 3D-миров. Unity поддерживает триангулированные или четырехугольные полигональные сетки. Поверхности Nurbs, Nurms, Subdiv должны быть преобразованы в полигоны. Подробнее
Посмотреть в Словарь. Использование экземпляров графического процессора полезно для рисования геометрии, которая несколько раз появляется в сцене, например деревьев или кустов. -
Группирование вызовов отрисовки: комбинируйте сетки, чтобы уменьшить количество вызовов отрисовки. Unity предоставляет следующие типы встроенной пакетной обработки вызовов отрисовки:
-
Статическая пакетная обработкаТехника, которую Unity использует для рисования игровых объектов на экране, сочетающая статические (неподвижные) GameObjects в большие Meshes и визуализирует их более быстрым способом. Подробнее
См. в Словаре: Объединение сеток из static GameObjects заранее. Unity отправляет объединенные данные на графический процессор, но рендерит каждую сетку в комбинации по отдельности. Unity по-прежнему может отбирать сетки по отдельности, но каждый вызов отрисовки требует меньше ресурсов, поскольку состояние данных никогда не меняется. -
Динамическая пакетная обработкаАвтоматический процесс Unity, который пытается визуализировать несколько мешей, как если бы они были единой сеткой для оптимизации графической производительности. Этот метод преобразует все вершины GameObject на ЦП и группирует множество похожих вершин вместе. Подробнее
См. в Словарь: преобразует вершины сетки на ЦП, группирует вершины, той же конфигурации и визуализирует их за один вызов отрисовки. Вершины имеют одинаковую конфигурацию, если они хранят одинаковое количество и тип атрибутов. Например,position
иnormal
.
-
Статическая пакетная обработкаТехника, которую Unity использует для рисования игровых объектов на экране, сочетающая статические (неподвижные) GameObjects в большие Meshes и визуализирует их более быстрым способом. Подробнее
- Объединение сеток вручную: вручную объединяйте несколько сеток в одну с помощью Mesh.CombineMeshes функция. Unity визуализирует комбинированную сетку за один вызов отрисовки вместо одного вызова отрисовки для каждой сетки.
- SRP Batcher: если в вашем проекте используется Scriptable Render Pipeline (SRP), используйте SRP Batcher, чтобы сократить время ЦП, которое требуется Unity для подготовки и отправки вызовов отрисовки для материалов, использующих тот же вариант шейдера.
Приоритет оптимизации
Вы можете использовать несколько методов оптимизации вызовов отрисовки в одной и той же сцене, но имейте в виду, что Unity отдает приоритет методам оптимизации вызовов отрисовки в определенном порядке. Если вы отметите GameObject для использования более одного метода оптимизации вызовов отрисовки, Unity использует метод с наивысшим приоритетом. Единственным исключением является дозатор SRP. Когда вы используете SRP Batcher, Unity также поддерживает статическое пакетирование для GameObjects, совместимых с SRP Batcher. Unity отдает приоритет оптимизации вызовов отрисовки в следующем порядке:
- SRP Batcher и статическая пакетная обработка
- Экземпляр GPU
- Динамическая пакетная обработка
Если вы пометите GameObject для статического пакетирования и Unity успешно его пакетирует, Unity отключит создание экземпляров GPU для этого GameObject, даже если средство визуализации использует шейдер создания экземпляров. Когда это происходит, открывается Инспекторокно Unity, в котором отображается информация о текущем выбранном игровом объекте, активе или настройках проекта, позволяя вам проверить и отредактируйте значения. Дополнительная информация
See in Словарь отображает предупреждающее сообщение, предлагающее отключить статическую пакетную обработку. Точно так же, если Unity может использовать создание экземпляров графического процессора для сетки, Unity отключает динамическую пакетную обработку для этой сетки.