Асинхронный шейдерПрограмма, работающая на графическом процессоре. Подробнее
See in Словарь — это функция, доступная только в редакторе, которая может улучшить ваш рабочий процесс, когда у вас есть сложные объекты шейдеров с множеством вариантов шейдеров.
Эта страница содержит следующую информацию:
- Обзор
- Как работает компиляция асинхронных шейдеров
- Включение и отключение асинхронной компиляции шейдеров для вашего проекта
- Включение и отключение асинхронной компиляции шейдеров для определенных вызовов рендеринга
- Отключение асинхронной компиляции шейдера для определенного объекта шейдера
- Обнаружение компиляции асинхронного шейдера в редакторе Unity
- Расширенный рендеринг в редакторе и компиляция асинхронных шейдеров
- Инструменты пользовательского редактора и асинхронная компиляция шейдеров
Обзор
Объекты шейдера могут содержать сотни или тысячи вариантов шейдераA версия шейдерной программы, которую Unity генерирует в соответствии с определенной комбинацией ключевых слов шейдера и их статусом. Объект Shader может содержать несколько вариантов шейдера. Подробнее
См. в Словарь. Если бы редактор компилировал все варианты при загрузке объекта Shader, процесс импорта был бы очень медленным. Вместо этого Редактор компилирует варианты шейдеров по запросу, при первом их обнаружении.
Компиляция этих вариантов шейдера может привести к зависанию редактора на миллисекунды или даже секунды, в зависимости от графического API и сложности объекта шейдера. Чтобы избежать таких задержек, вы можете использовать асинхронную компиляцию шейдера для компиляции вариантов шейдера в фоновом режиме, а тем временем использовать замещающие объекты шейдера.
Как работает асинхронная компиляция шейдеров
Асинхронная компиляция шейдеров работает следующим образом:
- Когда редактор впервые обнаруживает нескомпилированный вариант шейдера, он добавляет этот вариант шейдера в очередь компиляции в потоке задания. Индикатор выполнения в правом нижнем углу редактора показывает состояние очереди компиляции.
- Пока загружается вариант шейдера, Editor визуализирует геометрию с помощью шейдера-заполнителя, который выглядит как простой голубой цвет.
- Когда редактор завершит компиляцию варианта шейдера, он визуализирует геометрию с использованием варианта шейдера.
Исключения
Применяются следующие исключения:
- Если вы рисуете геометрию с помощью
DrawProcedural
илиCommandBuffer.DrawProcedural
редактор не использует замещающий шейдер. Вместо этого редактор просто пропускает рендерингпроцесс вывода графики на экран (или в текстуру рендеринга). По умолчанию основная камера в Unity отображает изображение на экране. Подробнее
Просматривайте в Словарь эту геометрию, пока не будет скомпилирован вариант шейдера. - Редактор Unity не использует асинхронную компиляцию шейдеров с Blitсокращенным термином для «передачи битового блока». Блит-операция — это процесс передачи блоков данных из одного места в памяти в другое.
См. в разделе Словарь операций. Это гарантирует правильный вывод в наиболее распространенных случаях использования.
Включение и отключение асинхронной компиляции шейдеров для вашего проекта
Асинхронная компиляция шейдеров включена по умолчанию.
Чтобы включить или отключить компиляцию асинхронного шейдера:
- Выберите Правка > Настройки проекта > Редактор.
- Внизу настроек редактора в разделе Компиляция шейдеров установите или снимите флажок Асинхронная компиляция шейдеров.
Примечание. Включение и отключение асинхронной компиляции шейдеров таким образом влияет только на SceneA Scene содержит окружение и меню вашей игры. Думайте о каждом уникальном файле сцены как об уникальном уровне. В каждой сцене вы размещаете свое окружение, препятствия и декорации, по сути проектируя и создавая свою игру по частям. Подробнее
Смотреть в Словарь и в представлениях игры по умолчанию. Если вы хотите использовать его в других частях редактора, см. раздел Инструменты пользовательского редактора и компиляция асинхронных шейдеров.
Включение и отключение асинхронной компиляции шейдеров для определенных вызовов рендеринга
Вы можете включить или отключить компиляцию асинхронного шейдера для определенных команд рендеринга в своих скриптах C#фрагмент кода, который позволяет вам создавайте свои собственные Компоненты, инициируйте игровые события, изменяйте свойства Компонентов с течением времени и реагируйте на действия пользователя любым удобным для вас способом. Подробнее
См. в Словарь.
Следующие инструкции показывают, как включить или отключить функцию в непосредственной области действия и в области CommandBuffer.
В непосредственной близости
В непосредственной области можно использовать ShaderUtil.allowAsyncCompilation
.
Для этого:
- Сохранить текущее состояние
ShaderUtil.allowAsyncCompilation
в переменной. - Перед вызовом команд рендеринга установите для
ShaderUtil.allowAsyncCompilation
значениеfalse
. - Вызовите команды рендеринга.
- После вызова команд рендеринга восстановите
ShaderUtil.allowAsyncCompilation
до прежнего состояния.
Вот пример псевдокода:
// Store the current state
bool oldState = ShaderUtil.allowAsyncCompilation;
// Disable async compilation
ShaderUtil.allowAsyncCompilation = false;
// Enter your rendering code that should never use the placeholder shader
Graphics.DrawMesh(...);
// Restore the old state
ShaderUtil.allowAsyncCompilation = oldState;
В области CommandBuffer
В области CommandBuffer
вы можете использовать ShaderUtil.SetAsyncCompilation
и ShaderUtil.RestoreAsyncCompilation
.
- Непосредственно перед вызовом команд рендеринга вызовите
ShaderUtil.SetAsyncCompilation
и установите для него значениеfalse
. Последующие команды в CommandBuffer не допускают асинхронную компиляцию. - Добавьте команды рендеринга в CommandBuffer.
- После команд рендеринга вызовите
Shader.Util.RestoreAsyncCompilation
, чтобы восстановить состояние компиляция асинхронного шейдера.
Вот пример:
// Create the CommandBuffer
CommandBuffer cmd = new CommandBuffer();
// Disable async compilation for subsequent commands
ShaderUtil.SetAsyncCompilation(cmd, false);
/// Enter your rendering commands that should never use the placeholder shader
cmd.DrawMesh(...);
// Restore the old state
ShaderUtil.RestoreAsyncCompilation(cmd);
Отключение асинхронной компиляции для определенных объектов Shader
Вы можете отключить асинхронную компиляцию шейдера для определенных объектов шейдера, заставив редактор всегда компилировать их синхронно. Это хороший вариант для объектов Shader, генерирующих данные, которые всегда присутствуют в начале вашего рендеринга и которые относительно быстро компилируются. Скорее всего, вам это понадобится, если вы выполняете расширенный рендеринг.
Чтобы принудительно выполнить синхронную компиляцию объекта шейдера, добавьте #pragma editor_sync_compilation
директиву в исходный код шейдера.
Примечание. Не следует форсировать синхронную компиляцию для сложных объектов Shader, которые во время рендеринга сталкиваются с новыми вариантами шейдера; это может привести к остановке рендеринга в редакторе.
Обнаружение компиляции асинхронного шейдера
Вы можете использовать C# API для отслеживания состояния компиляции асинхронного шейдера и выполнения операций при изменении этого состояния.
Скорее всего, это полезно при расширенном рендеринге; если шейдер-заполнитель загрязняет ваши сгенерированные данные, вы можете дождаться завершения компиляции, отбросить загрязненные данные и повторно создать новый набор с правильными вариантами шейдера.
Если вы уже знаете, какой материал вас интересует, вы можете использовать ShaderUtil.IsPassCompiled
, чтобы проверить статус компиляции варианта шейдера. Когда статус изменится с Uncompiled на Compiled, компиляция завершена.
Если вы не знаете, какой материал вас интересует, или если вас интересуют более одного материала, вы можете использовать ShaderUtil.anythingCompiling
, чтобы определить, компилирует ли Unity любые варианты шейдера асинхронно. Когда это значение изменяется с true
на false
, вся текущая компиляция завершена.
Расширенный рендеринг в редакторе и компиляция асинхронных шейдеров
Решения для расширенного рендеринга основаны на однократном создании данных и их повторном использовании в следующих кадрах. Если во время этого процесса редактор использует шейдер-заполнитель, он может исказить сгенерированные данные. Если это произойдет, вы увидите голубой цвет или другие артефакты рендеринга в своей сцене даже после завершения компиляции вариантов шейдера.
Чтобы избежать этого, вы можете:
- Полностью отключите компиляцию асинхронных шейдеров для вашего проекта
- Отключить асинхронную компиляцию шейдеров для определенных вызовов рендеринга
- Отключить компиляцию асинхронного шейдера для определенного объекта шейдера
- Определите, когда источник загрязнения данных завершит компиляцию, а затем повторно сгенерируйте данные.
Инструменты пользовательского редактора и компиляция асинхронных шейдеров
По умолчанию асинхронная компиляция шейдеров работает в игре и представлении сценыинтерактивном представлении мира, который вы создаете. Вы используете Scene View для выбора и размещения пейзажей, персонажей, камер, источников света и всех других типов игровых объектов. Дополнительная информация
См. в Словарь. Если вы хотите использовать его в пользовательских инструментах редактора, вы можете включить его через C# для своего пользовательского инструмента.
Для этого вы можете включить асинхронную компиляцию шейдеров для определенных вызовов рендеринга.
Настройка рендеринга во время компиляции
Вы можете сделать так, чтобы ваши пользовательские инструменты рисовали что-то другое, кроме шейдера-заполнителя для каждого материала. Таким образом, вы можете избежать рендеринга в простом голубом цвете и вместо этого рисовать что-то еще, пока вариант шейдера компилируется.
Чтобы проверить, скомпилирован ли конкретный вариант шейдера, см. раздел Обнаружение компиляции асинхронного шейдера.
Чтобы запустить компиляцию вручную, вы можете использовать ShaderUtil.CompilePass
. Таким образом, вы можете избежать рендеринга с голубым заполнителем и рисовать что-то еще, пока компилируется вариант шейдера.