Video Tutorials
Interface
Essentials
Advanced
Полезные советы
UnigineEditor
Interface Overview
Assets Workflow
Settings and Preferences
Working With Projects
Adjusting Node Parameters
Setting Up Materials
Setting Up Properties
Lighting
Landscape Tool
Using Editor Tools for Specific Tasks
Extending Editor Functionality
Программирование
Fundamentals
Setting Up Development Environment
Usage Examples
UnigineScript
C++
C#
UUSL (Unified UNIGINE Shader Language)
File Formats
Rebuilding the Engine Tools
GUI
Double Precision Coordinates
API
Containers
Common Functionality
Controls-Related Classes
Engine-Related Classes
Filesystem Functionality
GUI-Related Classes
Math Functionality
Node-Related Classes
Objects-Related Classes
Networking Functionality
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
IG Plugin
CIGIConnector Plugin
Rendering-Related Classes
Работа с контентом
Content Optimization
Materials
Art Samples
Tutorials

Принудительная компиляция шейдеров

Шейдер - это небольшая программа, выполняемая на графическом процессоре, и, конечно же, для ее компиляции и загрузки требуется некоторое время. Обычно компиляция и загрузка одной программы GPU не занимает много времени, но шейдеры часто имеют много «вариантов». Сложные шейдеры имеют несколько директив препроцессора (определений) для различных случаев, каждая комбинация этих директив определяет вариант шейдера. В итоге нам приходится компилировать тысячи немного разных программ на GPU. Компиляция шейдеров по запросу во время выполнения вызывает зависания и требует дополнительной памяти. Чтобы уменьшить эти накладные расходы, все необходимые комбинации шейдеров анализируются, компилируются и сохраняются в кеше шейдеров . Загрузка предварительно скомпилированных шейдеров из кеша происходит намного быстрее.

Кэш шейдеров для OpenGL представляет собой предварительный перевод шейдеров из UUSL в GLSL , а не компиляцию. Он генерируется в 5-10 раз быстрее, чем для DirectX, но использует в 5-6 раз больше дискового пространства.

Примечание
Кэш шейдеров DirectX, созданный для отладочных сборок, не следует использовать для сборок выпуска, так как компиляция шейдеров выполняется без оптимизации. Повторно сгенерируйте кеш шейдеров DirectX для вашей сборки релиза для максимальной производительности (обеспеченной оптимизированной компиляцией).

Нет никаких особых требований к кешированию шейдеров, таких как установка или настройка какого-либо дополнительного программного обеспечения.

Каждый раз, когда движку не удается получить шейдер из кеша, требуемый шейдер компилируется и автоматически добавляется в кеш. Однако это может привести к спайку в вашем приложении (зависанию на некоторое время). Что совершенно неприемлемо для многих приложений (например, симуляторов в реальном времени). Итак, дело в том, что у вас должен быть самый полный кеш шейдеров, содержащий все варианты, которые используются в вашем приложении.

Примечание
Кэш шейдеров должен создаваться отдельно для сборок с плавающей точкой и двойной точностью, поскольку каждый из них использует свой собственный кеш шейдера (т.е. кеш, сгенерированный для точности с плавающей точкой, не подходит для сборки с двойной точностью). Если ваше приложение выпущено с обоими сборками float и double, вам придется дважды сгенерировать кеш шейдеров.

Предварительная компиляция всех шейдеров - важная функция, гарантирующая, что когда ваш проект будет завершен и окончательные сборки будут готовы к передаче клиентам, у вас будет полный кеш шейдеров. Это значительно уменьшает количество зависаний в окончательной сборке выпуска и сглаживает частоту кадров вашего приложения. Шейдеры предварительно скомпилированы для всех материалов в проекте.

Эта функция доступна с помощью кнопки Precompile All Shaders на панели инструментов рядом с кнопкой Play или через раздел Editor окна Settings при загрузке мира.

Параметр Precompile All Shaders на панели инструментов и в разделе Editor окна Settings

Вы можете использовать его одним из следующих способов:

  • Постоянная фоновая предварительная компиляция

    Когда эта кнопка включена, каждый раз, когда вы создаете новый материал, вы будете видеть следующее сообщение о компиляции шейдера в области просмотра:

    Примечание
    Вы можете остановить процесс генерации кеша шейдеров в случае, если ответ пользовательского интерфейса UnigineEditor стал слишком медленным, нажав соответствующую кнопку прямо в сообщении компиляции.

    Материалы, для которых еще не были скомпилированы шейдеры, будут временно заменены базовыми, окрашенными в серый цвет и не имеющими текстур. Это может занять несколько секунд в зависимости от производительности вашего компьютера. Эта опция гарантирует, что у вас всегда будет полный кеш шейдеров для выбранного графического API.

  • Предварительная компиляция по запросу

    Иногда постоянная фоновая компиляция шейдеров может мешать и замедлять вашу работу, это типично для некоторых движков. UNIGINE позволяет отключить предварительную компиляцию шейдеров. Вы можете включить его непосредственно перед измерением производительности вашей окончательной сборки. В этом случае генерация кэша шейдеров займет гораздо больше времени (до получаса) в зависимости от сложности вашего проекта и выбранного графического API. Но это будет выполняться только один раз вместо того, чтобы замедлять вашу работу каждый раз, когда вы вносите изменения в свои материалы.

    Примечание
    Этот режим рекомендуется программистам графики для экономии времени на перекомпиляцию при изменении состояния материалов.

Принудительная предварительная компиляция шейдеров гарантирует, что у вас будет наиболее полный независимый от мира кеш шейдеров для всех материалов в вашем проекте. Однако изменение некоторых локальных настроек, таких как настройки геодезической оси, ландшафта, воды или облаков (например, изменение состояния материала с помощью Tracker или логики вашего приложения), по-прежнему приводит к перекомпиляции шейдеров, но только локальным одна выполняется только для соответствующего типа объектов.

Для создания наиболее полного кеша шейдера для вашего проекта необходимо выполнить следующие действия:

  1. Откройте все миры, содержащие геодезические точки, рельеф, воду или облака.
  2. Для каждого из этих миров выполните следующие действия:
    • вода - поместите камеру сцены над водой, под водой и на ватерлинии между двумя средами.
    • местность - поместите камеру сцены высоко над ландшафтом и переместите ее на поверхность ландшафта.
    • облака - поместите камеру сцены над облаками, под облаками и внутри облаков.
  3. Создайте и запустите треки для всех состояний материала, которые вы планируете переключать с помощью логики вашего приложения.
Примечание
Чтобы свести к минимуму перекомпиляцию шейдеров для материалов, состояния которых должны быть изменены с помощью логики приложения, вы также можете создавать отдельные материалы, имеющие требуемые значения состояния, и переключаться между этими материалами вместо изменения состояний.

Кэш выходных шейдеров для DirectX / OpenGL создается внутри папки data:

  • shader_d3d11.cache
  • shader_gl.cache
Внимание
Не помещайте файлы кеша шейдеров в архивы UNG! У вас не будет существенного уменьшения размера файла, поскольку файлы кеша уже используют сжатие LZ4. Более того, в этом случае новые шейдеры, которые могут быть сгенерированы на стороне вашего конечного пользователя, не будут добавлены в кеш.

Когда ваш проект завершен и финальные сборки готовы к передаче клиентам, вам следует скопировать оба файла кеша (shader_gl.cache и shader_d3d11.cache) в каталог data окончательной сборки.

Если вы передаете имя проекта через командную строку или при инициализации движка:

Shell-команды
-project_name "YourProject"
вам следует скопировать файлы кеш-памяти шейдеров в следующий каталог:
  • Windows - C:/Users/<username>/YourProject/
  • Linux - /home/<username>/.YourProject/
Последнее обновление: 10.10.2020