Обзор
Каждый раз, когда вы создаете свой проект, редактор Unity компилирует все шейдеры, которые требуются для вашей сборки: каждый необходимый шейдерпрограмма который работает на графическом процессоре. Подробнее
См. вариант Словарь для каждого требуемого графического API.
Когда вы работаете в редакторе Unity, редактор не компилирует все заранее. Это связано с тем, что компиляция каждого варианта для каждого графического API может занять очень много времени.
Вместо этого редактор Unity делает следующее:
- При импорте объекта шейдера выполняется минимальная обработка (например, создание шейдера поверхности).
- Когда ему нужно отобразить вариант шейдера, он проверяет папку
Library/ShaderCache
. - Если он находит ранее скомпилированный вариант шейдера, использующий идентичный исходный код, он использует его.
- Если он не находит совпадения, он компилирует требуемый вариант шейдера и сохраняет результат в кэше.
- Примечание. Если вы включите асинхронную компиляцию шейдеров, это будет происходить в фоновом режиме, а в это время будет отображаться замещающий шейдер.
Компиляция шейдера выполняется с помощью процесса UnityShaderCompiler
. Можно запустить несколько процессов UnityShaderCompiler
(как правило, по одному на ядро ЦП на вашем компьютере), чтобы компиляция шейдеров во время сборки проигрывателя могла выполняться параллельно. Пока Редактор не компилирует шейдеры, процессы компилятора ничего не делают и не потребляют ресурсы компьютера.
Папка кэша шейдеров может стать довольно большой, если у вас много шейдеров, которые часто меняются. Эту папку можно безопасно удалить; это просто заставляет Unity перекомпилировать варианты шейдера.
Во время сборки игрока все «еще не скомпилированные» варианты шейдеров компилируются, так что они находятся в данных игры, даже если редактор их не использовал.
Различные компиляторы шейдеров
Разные платформы используют разные компиляторы шейдеров для компиляции программы шейдера следующим образом:
- Платформы, использующие DirectX, используют компилятор Microsoft FXC HLSL.
- Платформы, использующие OpenGL (Core и ES), используют компилятор Microsoft FXC HLSL с последующей трансляцией байт-кода в GLSL с использованием HLSLcc.
- Платформы, использующие Metal, используют компилятор Microsoft FXC HLSL с последующей трансляцией байт-кода в Metal с использованием HLSLcc.
- На платформах, использующих Vulkan, используется компилятор Microsoft FXC HLSL с последующей трансляцией байт-кода в SPIR-V с использованием HLSLcc.
- Другие платформы, например консольные, используют соответствующие компиляторы.
-
Шейдеры поверхностиУпрощенный способ написания шейдеров для встроенного конвейера рендеринга . Подробнее
См. в Словарь использование HLSL и MojoShader для этапа анализа генерации кода.
Вы можете настроить различные параметры компилятора шейдера с помощью директив прагмы.
Кэширующий препроцессор шейдера
Компиляция шейдера включает несколько шагов. Одним из первых шагов является предварительная обработка. На этом этапе программа, называемая препроцессором, подготавливает исходный код шейдера для компилятора.
В предыдущих версиях Unity редактор использовал препроцессор, предоставляемый компилятором шейдеров для текущей платформы. Теперь вы можете выбрать, использовать ли препроцессор кэширования шейдеров Unity или вернуться к предыдущему поведению. Если у вас не возникнет проблем, вам следует использовать препроцессор кэширующего шейдера.
Кэширующий препроцессор шейдеров оптимизирован для более быстрого импорта и компиляции шейдеров; это до 25% быстрее. Он работает путем кэширования промежуточных данных предварительной обработки, поэтому редактору нужно анализировать включаемые файлы только при изменении их содержимого. Это делает компиляцию нескольких вариантов одного и того же шейдера более эффективной. Включение препроцессора кэширования шейдеров дает наиболее заметный эффект, когда шейдеры в проекте используют большой набор общих включаемых файлов.
Помимо улучшенной производительности, препроцессор кэширования шейдеров добавляет следующие функции:
- Ограниченная поддержка директив
#pragma
внутри условий. - Поддержка директивы
#pragma warning
. - Поддержка директивы
#include_with_pragmas
, которая позволяет помещать директивы#pragma
во включаемые файлы. - Флажок Только предварительная обработка в инспекторе шейдеров позволяет просматривать предварительно обработанный исходный код для этого ресурса шейдера.
Подробную информацию о различиях между препроцессором кэширования шейдеров и предыдущим поведением см. на форуме Unity: Новый препроцессор шейдеров.
Вы можете включить или отключить кэширующий препроцессор шейдеров, установив флажок Кэширующий препроцессор шейдеров в разделе Компиляция шейдеров в редакторе . settings или с помощью API EditorSettings.cachingShaderPreprocessor.
Разбор времени сборки
Во время сборки игры Unity может обнаружить, что некоторые варианты внутренних шейдеров не используются игрой, и исключить их из данных сборки («удалить»). Дополнительную информацию см. в разделе Варианты шейдераВерсия программы шейдера, которую Unity генерируется в соответствии с определенной комбинацией ключевых слов шейдера и их статусом. Объект Shader может содержать несколько вариантов шейдера. More info
See in Словарь.