This page has been translated automatically.
Видеоуроки
Интерфейс
Основы
Продвинутый уровень
Подсказки и советы
Основы
Программирование на C#
Рендеринг
Профессиональный уровень (SIM)
Принципы работы
Свойства (properties)
Компонентная Система
Рендер
Физика
Редактор UnigineEditor
Обзор интерфейса
Работа с ассетами
Контроль версий
Настройки и предпочтения
Работа с проектами
Настройка параметров ноды
Setting Up Materials
Настройка свойств
Освещение
Sandworm
Использование инструментов редактора для конкретных задач
Расширение функционала редактора
Встроенные объекты
Ноды (Nodes)
Объекты (Objects)
Эффекты
Декали
Источники света
Geodetics
World-ноды
Звуковые объекты
Объекты поиска пути
Player-ноды
Программирование
Основы
Настройка среды разработки
Примеры использования
C++
C#
UnigineScript
UUSL (Unified UNIGINE Shader Language)
Плагины
Форматы файлов
Материалы и шейдеры
Rebuilding the Engine Tools
Интерфейс пользователя (GUI)
Двойная точность координат
API
Animations-Related Classes
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
VR-Related Classes
Работа с контентом
Оптимизация контента
Материалы
Визуальный редактор материалов
Material Nodes Library
Miscellaneous
Input
Math
Matrix
Textures
Art Samples
Учебные материалы

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

A shader is a small program executed on the GPU, and of course it takes some time to get compiled and loaded. Usually, compiling and loading a single GPU program does not take much time, but shaders often have a lot of "variants". Complex shaders have multiple preprocessor directives (defines) for various cases, each combination of these directives defines a shader variant. So we end up having to compile many thousands of slightly different GPU programs. Compiling shaders on demand at runtime causes freezes and requires extra memory. In order to reduce overhead, all required shader combinations are parsed, compiled, and stored in the shader cache. Loading precompiled shaders from cache is much faster. Шейдер - это небольшая программа, выполняемая на графическом процессоре, и, конечно же, для ее компиляции и загрузки требуется некоторое время. Обычно компиляция и загрузка одной программы GPU не занимает много времени, но шейдеры часто имеют много «вариантов». Сложные шейдеры имеют несколько директив препроцессора (определений) для различных случаев, каждая комбинация этих директив определяет вариант шейдера. В итоге нам приходится компилировать тысячи немного разных программ на GPU. Компиляция шейдеров по запросу во время выполнения вызывает зависания и требует дополнительной памяти. Чтобы уменьшить эти накладные расходы, все необходимые комбинации шейдеров анализируются, компилируются и сохраняются в кеше шейдеров . Загрузка предварительно скомпилированных шейдеров из кеша происходит намного быстрее.

Shader cache for OpenGL represents a pre-translation of shaders from UUSL to GLSL, not a compilation. It is generated 5-10 times faster than for DirectX but uses 5-6 times more disk space. Кэш шейдеров для OpenGL представляет собой предварительный перевод шейдеров из UUSL в GLSL , а не компиляцию. Он генерируется в 5-10 раз быстрее, чем для DirectX, но использует в 5-6 раз больше дискового пространства.

Примечание
DirectX shaders cache generated for debug builds should not be used for release builds, as shader compilation is performed without optimizations. Re-generate DirectX shaders cache for your release build for maximum performance (ensured by optimized compilation). Кэш шейдеров DirectX, созданный для отладочных сборок, не следует использовать для сборок выпуска, так как компиляция шейдеров выполняется без оптимизации. Повторно сгенерируйте кеш шейдеров DirectX для вашей сборки релиза для максимальной производительности (обеспеченной оптимизированной компиляцией).

There are no special requirements for shaders caching such as installing or setting up any additional software. Нет никаких особых требований к кешированию шейдеров, таких как установка или настройка какого-либо дополнительного программного обеспечения.

Every time when the Engine fails to retrieve a shader from the cache, the required shader is compiled and added to cache automatically. However, this may cause your application to "hiccup" (freeze for a while). Which is totally unacceptable for many applications (e.g. real-time simulators). So, the point is that you should have the most complete shader cache containing all variants that are used in your application. Каждый раз, когда движку не удается получить шейдер из кеша, требуемый шейдер компилируется и автоматически добавляется в кеш. Однако это может привести к спайку в вашем приложении (зависанию на некоторое время). Что совершенно неприемлемо для многих приложений (например, симуляторов в реальном времени). Итак, дело в том, что у вас должен быть самый полный кеш шейдеров, содержащий все варианты, которые используются в вашем приложении.

Примечание
The shaders cache should be generated for float- and double-precision builds separately, as each of them uses its own shader cache (i.e. cache generated for float precision is not suitable for a double-precision build). In case your application is released with both builds float and double, you'll have to generate shaders cache twice. Кэш шейдеров должен создаваться отдельно для сборок с плавающей точкой и двойной точностью, поскольку каждый из них использует свой собственный кеш шейдера (т.е. кеш, сгенерированный для точности с плавающей точкой, не подходит для сборки с двойной точностью). Если ваше приложение выпущено с обоими сборками float и double, вам придется дважды сгенерировать кеш шейдеров.

Precompilation of all shaders is an important feature guaranteeing, that at the time your project is completed and final builds are ready to be handed over to customers, you will have a complete shader cache. This significantly reduces the number of freezes in the final release build and smooths your application's framerate. Shaders are precompiled for all materials in the project. Предварительная компиляция всех шейдеров - важная функция, гарантирующая, что когда ваш проект будет завершен и окончательные сборки будут готовы к передаче клиентам, у вас будет полный кеш шейдеров. Это значительно уменьшает количество зависаний в окончательной сборке выпуска и сглаживает частоту кадров вашего приложения. Шейдеры предварительно скомпилированы для всех материалов в проекте.

This feature is available via the Precompile All Shaders button on the toolbar near the Play button or via the Editor section of the Settings window when a world is loaded. Эта функция доступна с помощью кнопки Precompile All Shaders на панели инструментов рядом с кнопкой Play или через раздел Editor окна Settings при загрузке мира.

Precompile All Shaders option on the toolbar and in the Editor section of the Settings windowПараметр Precompile All Shaders на панели инструментов и в разделе Editor окна Settings

You can use it in one of the following ways: Вы можете использовать его одним из следующих способов:

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

    When this button is enabled, each time you create a new material, you'll see the following message on shader compilation in the viewport: Когда эта кнопка включена, каждый раз, когда вы создаете новый материал, вы будете видеть следующее сообщение о компиляции шейдера в области просмотра:

    Примечание
    You can stop the process of shaders cache generation in case the UnigineEditor's UI response has become too slow via the corresponding button right on the compilation message. Вы можете остановить процесс генерации кеша шейдеров в случае, если ответ пользовательского интерфейса UnigineEditor стал слишком медленным, нажав соответствующую кнопку прямо в сообщении компиляции.

    Materials, for which the shaders were not yet compiled, will be temporarily replaced with base ones colored in grey and having no textures. This may take a couple of seconds depending on your computer's performance. This option guarantees, that you always have a complete shader cache for the selected graphics API. Материалы, для которых еще не были скомпилированы шейдеры, будут временно заменены базовыми, окрашенными в серый цвет и не имеющими текстур. Это может занять несколько секунд в зависимости от производительности вашего компьютера. Эта опция гарантирует, что у вас всегда будет полный кеш шейдеров для выбранного графического API.

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

    Sometimes constant background compilation of shaders may disturb and slow down your work, this is typical for some engines. UNIGINE lets you disable shaders precompilation. You can enable it just before measuring performance of your final build. In this case shader cache generation will take much more time (up to half an hour) depending on your project's complexity and selected graphics API. But it will be performed only once instead of slowing down your work each time you make changes to your materials. Иногда постоянная фоновая компиляция шейдеров может мешать и замедлять вашу работу, это типично для некоторых движков. UNIGINE позволяет отключить предварительную компиляцию шейдеров. Вы можете включить его непосредственно перед измерением производительности вашей окончательной сборки. В этом случае генерация кэша шейдеров займет гораздо больше времени (до получаса) в зависимости от сложности вашего проекта и выбранного графического API. Но это будет выполняться только один раз вместо того, чтобы замедлять вашу работу каждый раз, когда вы вносите изменения в свои материалы.

    Примечание
    This mode is recommended for graphics programmers to save time on recompilation when changing states of materials. Этот режим рекомендуется программистам графики для экономии времени на перекомпиляцию при изменении состояния материалов.

Forced shader precompilation ensures, that you have the most complete world-independent shaders cache for all materials in your project. However, changing some local settings, such as the ones for geodetic pivot, terrain, water, or clouds (e.g. changing some material state via the Tracker or your application logic) still leads to recompilation of shaders, but just a local one performed only for the corresponding type of objects. Принудительная предварительная компиляция шейдеров гарантирует, что у вас будет наиболее полный независимый от мира кеш шейдеров для всех материалов в вашем проекте. Однако изменение некоторых локальных настроек, таких как настройки геодезической оси, ландшафта, воды или облаков (например, изменение состояния материала с помощью Tracker или логики вашего приложения), по-прежнему приводит к перекомпиляции шейдеров, но только локальным одна выполняется только для соответствующего типа объектов.

The following actions should be performed to generate the most complete shader cache for your project: Для создания наиболее полного кеша шейдера для вашего проекта необходимо выполнить следующие действия:

  1. Open all worlds, that contain geodetic pivot, terrain, water, or clouds. Откройте все миры, содержащие геодезические точки, рельеф, воду или облака.
  2. For each of these worlds perform the following:
    • water - put a scene camera over water, under water and at the waterline between the two media.water - put a scene camera over water, under water and at the waterline between the two media.
    • terrain - put a scene camera high above the terrain and move it to the terrain surface.terrain - put a scene camera high above the terrain and move it to the terrain surface.
    • clouds - put a scene camera over above the clouds, under the clouds and inside the clouds.clouds - put a scene camera over above the clouds, under the clouds and inside the clouds.
    water - put a scene camera over water, under water and at the waterline between the two media.terrain - put a scene camera high above the terrain and move it to the terrain surface.clouds - put a scene camera over above the clouds, under the clouds and inside the clouds.
    Для каждого из этих миров выполните следующие действия:
    • water - put a scene camera over water, under water and at the waterline between the two media. вода - поместите камеру сцены над водой, под водой и на ватерлинии между двумя средами.
    • terrain - put a scene camera high above the terrain and move it to the terrain surface. местность - поместите камеру сцены высоко над ландшафтом и переместите ее на поверхность ландшафта.
    • clouds - put a scene camera over above the clouds, under the clouds and inside the clouds. облака - поместите камеру сцены над облаками, под облаками и внутри облаков.
  3. Create and launch tracks for all material states, that you plan to switch via your application's logic. Создайте и запустите треки для всех состояний материала, которые вы планируете переключать с помощью логики вашего приложения.
Примечание
To minimize run-time recompilation of shaders for materials, whose states are to be changed via the application logic, you can also create separate materials having the required state values and switch between these materials instead of changing states. Чтобы свести к минимуму перекомпиляцию шейдеров для материалов, состояния которых должны быть изменены с помощью логики приложения, вы также можете создавать отдельные материалы, имеющие требуемые значения состояния, и переключаться между этими материалами вместо изменения состояний.

Output shader cache for DirectX / OpenGL / Vulkan is generated inside the data folder: Кэш выходных шейдеров для DirectX / OpenGL / Vulkan создается внутри папки data:

  • DirectX 11 — shader_d3d11.cache
  • DirectX 12 — shader_d3d12_dxc.cache, pso_log_d3d12_dxc.cache
  • OpenGL — shader_gl.cache
  • Vulkan — shader_vk.cache, pso_log_vk.cache
Внимание
Do not put shader cache files to UNG archives! You will not have a substantial file size reduction, as cache files already use LZ4 compression. Moreover, in this case new shaders, that can be generated on your end user's side, won't be added to cache. Не помещайте файлы кеша шейдеров в архивы UNG! У вас не будет существенного уменьшения размера файла, поскольку файлы кеша уже используют сжатие LZ4. Более того, в этом случае новые шейдеры, которые могут быть сгенерированы на стороне вашего конечного пользователя, не будут добавлены в кеш.

As your project is completed and final builds are ready to be handed over to customers, you should copy all shader cache files to the data directory of the final build. Когда ваш проект завершен и финальные сборки готовы к передаче клиентам, вам следует скопировать все файлы кеша в каталог data окончательной сборки.

If you pass a project name via the command line or on engine initialization:

Shell-команды
-project_name "YourProject"
you should copy shader cache files to the following directory:Если вы передаете имя проекта через командную строку или при инициализации движка:

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