Руководство по PSO в Unreal Engine 4

0
9
Включение и построение кэширования PSO в Unreal Engine 4

На следующей странице вы найдете все различные команды и опции, которые можно использовать с системой кэширования объекта состояния системы импорта (Pipeline State Object – PSO).

Свойства

СвойствоОписание
SetBatchMode BackgroundСледует использовать вне интерактивных меню.
SetBatchMode FastСледует использовать при отображении экрана загрузки или видео, чтобы можно было скомпилировать больше PSO.
ResumeBatchingСледует использовать для перезапуска процесса группирования.
NumPrecompilesRemainingИспользуется для определения общего количества ожидающих PSO для компиляции.
NumPrecompilesActiveВозвращает количество систем импорта, активно предкомпилирующих этот фрейм.
OpenPipelineFileCacheОткрывает файл кэша системы импорта шейдера с параметром LastOpened, если он доступен, или в противном случае – с именем проекта.
SavePipelineFileCacheСохраняет текущий кэш системы импорта шейдера на диск, используя один из определенных режимов сохранения, Fast использует пошаговый подход, тогда как Slow объединяет все данные в файл.
ClosePipelineFileCacheЗакрывает существующий кеш системы импорта, позволяя открыть его с другой файловой и/или шейдерной платформой. Будет неявно ссылаться на быстрое сохранение.
ShaderLibraryStateChangedВызывается с помощью FShaderCodeLibrary, чтобы уведомить о том, что состояние библиотеки кода шейдера изменилось, а доступность шейдера потребуется пересмотреть.
SetGameUsageMaskWithComparisonУстанавливает текущую используемую маску игры PSO и функцию сравнения. Возвращает значение -true, если эта маска отличается от старой маски, или -false, если не отличается, или система кэширования отключена, или если функция маски отключена. Любые новые найденные PSO будут регистрироваться с этим значением, или существующие PSO должны обновлять свои маски. Смотрите FPipelineFileCache для более подробной информации.

FShaderPipelineCache

FShaderPipelineCache предоставляет новый механизм регистрации, сериализации и прекомпиляции PSO, который заменяет FShaderCache. Кэширование объектов состояния системы импорта и сериализация инициализаторов на диск позволяет в следующий раз при запуске игры выполнять предварительную компиляцию этих состояний, что снижает сцепление. Для достижения этой цели FShaderPipelineCache опирается на FShaderCodeLibrary & “Share Shader Code” и на конечную часть FPipelineFileCache уровня RHI.

Основное использование во время выполнения

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

  • Вы можете включить кеш с ShaderPipelineCache.Enabled = 1, что позволяет кешу системы импорта загружать существующие данные с диска и предварительно компилировать их.
  • Установка размера пакета по умолчанию с помощью ShaderPipelineCache.BatchSize = X, где X – максимальное количество PSO для компиляции в одном пакете при предварительной компиляции в Fast BatchMode по умолчанию.
  • Установка размера фонового пакета с помощью ShaderPipelineCache.BackgroundBatchSize = X, где X – максимальное количество PSO для компиляции в фоновом пакетном режиме.
  • Инструментирует код игры, чтобы вызвать FShaderPipelineCache::SetBatchMode, чтобы переключить пакетный режим между режимами Fast и Background.
  • BatchMode::Fast следует использовать, когда отображается экран загрузки или видео, чтобы можно было компилировать больше PSO, тогда как Background следует использовать вне интерактивных меню. При необходимости вызовите NumPrecompilesRemaining, чтобы определить общее количество ожидающих PSO для компиляции и оставьте экран загрузки или видео видимым до завершения.
  • В зависимости от производительности игры и целевой платформы может также потребоваться вызвать PauseBatching, чтобы приостановить прекомпиляцию во время игры, и затем ResumeBatching, чтобы перезапустить прекомпиляцию за экраном загрузки, меню или видео.

Другие параметры времени выполнения

Следующие команды могут использоваться для дальнейшего контроля, когда PSO создает кеш.

  • В GGameIni (и, следовательно, также в GGameUserSettingsIni) кэш Shader Pipeline использует секцию [ShaderPipelineCache.CacheFile] для хранения некоторых настроек.
  • Параметр LastOpened сохраняет имя последнего открытого файла кэша, как указано в параметре Open, который в случае присутствия будет использоваться в FShaderPipelineCache::Initialize для открытия существующего кэша. Если он не указан, по умолчанию используется значение AppName.
  • Настройки SortMode хранят желаемый режим сортировки для PSO, который является одним из:
  • Default: загружается в указанном в файле порядке.
  • FirstToLatestUsed: начинает с нескольких PSO с самым низким использованным первым кадром и переходит к другим PSO с самым высоким кадром.
  • MostToLeastUsed: начинает с наиболее часто используемых PSO, работающих в направлении наименьшего.
  • Будет использовать «Default» в FShaderPipelineCache::Initialize & OpenPipelineFileCache, если ничего не указано.
  • GameVersionKey – это целое число только для чтения, указанное в GGameIni, которое указывает версию игрового контента для устранения неоднозначности несовместимых версий игрового контента. По умолчанию это берется из списка изменений FEngineVersion.

Использование Журнала

Следующие команды могут использоваться при захвате данных PSO.

  • Вы можете включить кэш PSO с помощью команды ShaderPipelineCache.Enabled = 1, а затем включить ведение журнала времени выполнения с помощью команды r.ShaderPipelineCache.LogPSO = 1.
  • При этом нужно убедиться, что вы настроили игру, чтобы при запуске открывать соответствующий кеш и позволить игре воспроизводиться.
  • PSO регистрируются так, как они сталкиваются, поскольку Unreal Engine 4 (UE4) не предоставляет возможности готовить их в автономном режиме, поэтому эта система будет собирать только PSO, которые фактически используются для рендеринга.
  • Таким образом, вы должны либо вручную пройти игру, чтобы собрать логи (logs), либо автоматизировать процесс, выходящий за рамки этого кода.
  • Данные могут быть сохранены в любое время, если вызвать FShaderPipelineCache::SavePipelineFileCache, и это может произойти автоматически после заданного количества PSO, установив ShaderPipelineCache.SaveAfterPSOsLogged = X, где X – желаемое количество PSO для записи перед сохранением (0 отключит автосохранение).
  • Файлы журналов относятся к конкретной платформе шейдеров, чтобы уменьшить накладные расходы.

Расположение Файлов и Упаковка

Следующая информация предоставила больше подробностей о том, где будут храниться данные PSO.

  • Доступный для записи файл кэша всегда хранится в папке Сохраненные пользователем / User Saved.
  • Игра также может предоставить неизменную копию в своем каталоге игрового контента, которая будет использоваться в качестве исходных или начальных данных.
  • Сгенерировав логи в разработке и объединив их с MergeShaderPipelineCaches, вы получите упакованные логи в каталоге Game Content для соответствующей платформы.

Требования

Следующие требования должны быть соблюдены при попытке настроить PSO для захвата в вашем проекте.

  • FShaderCodeLibrary должен быть включен через Project Settings > Packaging > Share Material Shader Code.
  • Включение Native Shader Libraries необязательно, но настоятельно рекомендуется для Metal.

Дополнительные Примечания

  • Открытый кэш-файл можно изменить, закрыв существующий файл с помощью ClosePipelineFileCache (который неявно быстро сохраняет), а затем открыв новый файл с помощью OpenPipelineFileCache.
  • При входе в систему, если вы переключаете файлы, будут регистрироваться только новые записи после переключения, что означает, что вы пропустите все PSO, которые должны были быть зарегистрированы до переключения. Это предотвращает загрязнение кеша неожиданными записями.
  • Командный параметр MergeShaderPipelineCaches можно использовать для объединения кэш-файлов с одинаковой версией файла, платформой шейдера и версией игры.