Принудительная компиляция шейдеров
Шейдер - это небольшая программа, выполняемая на графическом процессоре, и, конечно же, для ее компиляции и загрузки требуется некоторое время. Обычно компиляция и загрузка одной программы GPU не занимает много времени, но шейдеры часто имеют много «вариантов». Сложные шейдеры имеют несколько директив препроцессора (определений) для различных случаев, каждая комбинация этих директив определяет вариант шейдера. В итоге нам приходится компилировать тысячи немного разных программ на GPU. Компиляция шейдеров по запросу во время выполнения вызывает зависания и требует дополнительной памяти. Чтобы уменьшить эти накладные расходы, все необходимые комбинации шейдеров анализируются, компилируются и сохраняются в кеше шейдеров . Загрузка предварительно скомпилированных шейдеров из кеша происходит намного быстрее.
Кэш шейдеров для OpenGL представляет собой предварительный перевод шейдеров из UUSL в GLSL , а не компиляцию. Он генерируется в 5-10 раз быстрее, чем для DirectX, но использует в 5-6 раз больше дискового пространства.
Нет никаких особых требований к кешированию шейдеров, таких как установка или настройка какого-либо дополнительного программного обеспечения.
Каждый раз, когда движку не удается получить шейдер из кеша, требуемый шейдер компилируется и автоматически добавляется в кеш. Однако это может привести к спайку в вашем приложении (зависанию на некоторое время). Что совершенно неприемлемо для многих приложений (например, симуляторов в реальном времени). Итак, дело в том, что у вас должен быть самый полный кеш шейдеров, содержащий все варианты, которые используются в вашем приложении.
Предварительная компиляция всех шейдеров - важная функция, гарантирующая, что когда ваш проект будет завершен и окончательные сборки будут готовы к передаче клиентам, у вас будет полный кеш шейдеров. Это значительно уменьшает количество зависаний в окончательной сборке выпуска и сглаживает частоту кадров вашего приложения. Шейдеры предварительно скомпилированы для всех материалов в проекте.
Эта функция доступна с помощью кнопки Precompile All Shaders на панели инструментов рядом с кнопкой Play или через раздел Editor окна Settings при загрузке мира.
Вы можете использовать его одним из следующих способов:
-
Постоянная фоновая предварительная компиляция
Когда эта кнопка включена, каждый раз, когда вы создаете новый материал, вы будете видеть следующее сообщение о компиляции шейдера в области просмотра:
Вы можете остановить процесс генерации кеша шейдеров в случае, если ответ пользовательского интерфейса UnigineEditor стал слишком медленным, нажав соответствующую кнопку прямо в сообщении компиляции.Материалы, для которых еще не были скомпилированы шейдеры, будут временно заменены базовыми, окрашенными в серый цвет и не имеющими текстур. Это может занять несколько секунд в зависимости от производительности вашего компьютера. Эта опция гарантирует, что у вас всегда будет полный кеш шейдеров для выбранного графического API.
Предварительная компиляция по запросу
Иногда постоянная фоновая компиляция шейдеров может мешать и замедлять вашу работу, это типично для некоторых движков. UNIGINE позволяет отключить предварительную компиляцию шейдеров. Вы можете включить его непосредственно перед измерением производительности вашей окончательной сборки. В этом случае генерация кэша шейдеров займет гораздо больше времени (до получаса) в зависимости от сложности вашего проекта и выбранного графического API. Но это будет выполняться только один раз вместо того, чтобы замедлять вашу работу каждый раз, когда вы вносите изменения в свои материалы.
Этот режим рекомендуется программистам графики для экономии времени на перекомпиляцию при изменении состояния материалов.
Принудительная предварительная компиляция шейдеров гарантирует, что у вас будет наиболее полный независимый от мира кеш шейдеров для всех материалов в вашем проекте. Однако изменение некоторых локальных настроек, таких как настройки геодезической оси, ландшафта, воды или облаков (например, изменение состояния материала с помощью Tracker или логики вашего приложения), по-прежнему приводит к перекомпиляции шейдеров, но только локальным одна выполняется только для соответствующего типа объектов.
Для создания наиболее полного кеша шейдера для вашего проекта необходимо выполнить следующие действия:
- Откройте все миры, содержащие геодезические точки, рельеф, воду или облака.
- Для каждого из этих миров выполните следующие действия:
- вода - поместите камеру сцены над водой, под водой и на ватерлинии между двумя средами.
- местность - поместите камеру сцены высоко над ландшафтом и переместите ее на поверхность ландшафта.
- облака - поместите камеру сцены над облаками, под облаками и внутри облаков.
- Создайте и запустите треки для всех состояний материала, которые вы планируете переключать с помощью логики вашего приложения.
Кэш выходных шейдеров для DirectX / OpenGL создается внутри папки data:
- shader_d3d11.cache
- shader_gl.cache
Когда ваш проект завершен и финальные сборки готовы к передаче клиентам, вам следует скопировать оба файла кеша (shader_gl.cache и shader_d3d11.cache) в каталог data окончательной сборки.
Если вы передаете имя проекта через командную строку или при инициализации движка:
-project_name "YourProject"
- Windows - C:/Users/<username>/YourProject/
- Linux - /home/<username>/.YourProject/