Компиляция шейдерного кэша для CRYENGINE 5.3. Оптимизация CRYENGINE 5.

21. октября 2017 CRYENGINE 5 0

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

Официальная документация по теме:

http://docs.cryengine.com/display/CEPROG/ShaderCache+Generation

http://docs.cryengine.com/display/CEPROG/Remote+Shader+Compiler

http://docs.cryengine.com/display/CEPROG/Shader+Cache

Предусмотрено два режима работы с шейдерным кэшем:

1. Использование заранее скомпилированного шейдерного кэша, который создаётся по списку шейдерных комбинаций shaderlist.txt, встречающихся на уровнях игры. Это наиболее предпочтительный режим для релизной сборки игры.

Когда отключена компиляция шейдерного кэша на ходу, то движок будет брать шейдерный кэш из global shader cache, который является содержимым <Root your game>\engine\

shadercache.pak

shadercachestartup.pak

shadersbin.pak

При этом важно учитывать, что если компиляция шейдерного кэша на ходу отключена и движок не найдёт в global shader cache нужную комбинацию, то объекты, использующие эту комбинацию, не будут корректно отрисовываться.

Так же в <Root your game>\engine\ можно увидеть engine.pak и shaders.pak.

engine.pak — здесь содержаться различные конфигурационные файлы и некоторые базовые ресурсы для движка.

shaders.pak — это непосредственно шейдеры движка в бинарном формате. Важно не путать шейдерный кэш и сами шейдеры.

Из shaders.pak\HWScripts\CryFX можно удалить исходники шейдеров с расширением .cfi и .cfx.

2. Компиляция шейдерного кэша на ходу осуществляется во время игры по необходимости. У этого режима основными недостатками являются работа только в Windows и кратковременные, но сильные подтормаживания, вызываемые пиковыми загрузками CPU под 100% во время компиляции шейдерных комбинаций.

Чтобы включить компиляцию шейдерного кэша и выключить подгрузку из shadercache.pak, shadercachestartup.pak и shadersbin.pak необходимо прописать в system.cfg:

r_shadersAsyncActivation=1

r_shadersAsyncCompiling=3

r_shadersSubmitRequestLine=1

В релизной сборке игры должны быть отключены (задать нулевое значение).

Если включена компиляция шейдерного кэша на ходу, то движок не будет подгружать шейдерный кэш из global shader cache = shadercache.pak, shadercachestartup.pak и shadersbin.pak.


Применение Remote Shader Compiler.

Когда компиляция шейдерного кэша включена r_shadersAsyncActivation=1, а дистанционная компиляция отключена r_shadersRemoteCompiler=0, то шейдерный кэш будет сохраняться локально в <Root your game>\user\shaders\cache.


Локально скомпилированный шейдерный кэш (без использования Remote Shader Compiler) работает только для DX-рендера на Windows, следовательно, для Linux и консолей необходимо осуществлять компиляцию дистанционным компилятором шейдерного кэша r_shadersRemoteCompiler=1.

Локально скомпилированный шейдерный кэш не будет работать, если его упаковать в shadercache.pak, shadercachestartup.pak и shadersbin.pak, поэтому необходимо использовать дистанционный компилятор шейдерного кэшаRemote Shader Compiler.

Дистанционный компилятор шейдерного кэша (Remote Shader Compiler) находится в <Root CRYENGINE>\Tools\RemoteShaderCompiler и называется CrySCompileServer.exe.


Запросы на дистанционную компиляцию выполняются параллельно, поэтому чем больше ядер у сервера, тем лучше. Сервером может выступать в том числе локальная машина.

Необходимо скопировать каталог RemoteShaderCompiler вместе с содержимым в каталог своего проекта/сборки игры в <Root your game>\Tools\. Впоследствии нужно будет включать CrySCompileServer.exe и запускать игру, чтобы начать компилировать комбинации шейдерного кэша, всё это будет описано ниже.


Настройка конфигурационного файла для Remote Shader Compiler.

Перед запуском дистанционного компилятора необходимо прописать настройки в его конфигурационный файл <Root your game>\Tools\RemoteShaderCompiler\config.ini.

Пример содержимого config.ini:

TempDir=C:\SHADER_CACHE
port=31455
PrintErrors=1

Описание:

TempDir=C:\SHADER_CACHE каталог, куда будет сохраняться временный кэш в процессе компилирования. Можно указать любой желаемый, но без кириллицы в пути.
port=31455 — указать порт. По умолчанию 31455 или 61453.
PrintErrors=1 — выводить предупреждения.


Конфигурирование system.cfg для активации Remote Shader Compiler.

system.cfg должен быть в корне проекта/сборки игры.

Примечание: Для релизной сборки игры нужно будет подготовить system.cfg с такими параметрами, чтобы Remote Shader Compiler и компиляция шейдерного кэша на лету были выключены! Пример содержимого релизного system.cfg будет ближе к концу статьи.

Пример полного списка параметров system.cfg для работы с Remote Shader Compiler:

sys_game_folder=Assets
sys_dll_game=CryGameSDK
sys_localization_folder=languages
s_AudioImplName=CryAudioImplWwise
sys_spec=3

sys_no_crash_dialog=1
sys_vr_support = 0
log_IncludeTime=3
log_Verbosity=3

r_shadersAsyncActivation=1

r_ShadersAsyncCompiling=3
r_ShadersRemoteCompiler=1
r_ShaderCompilerServer=192.168.1.3
r_ShaderCompilerPort=31455
r_ShadersAsyncMaxThreads=8
r_driver=DX11
r_ShadersDX11=1
-- r_driver=GL
-- r_ShadersGL4=1
r_ShadersUserFolder=1
r_ShadersSubmitRequestline=1

r_ShadersDurango=0
r_ShadersOrbis=0
r_multithreaded=0

Описание основных специфических параметров:

r_shadersAsyncActivation=1 — включить компиляцию шейдерного кэша на ходу.

r_ShadersAsyncCompiling=3 —  метод асинхронной компиляции.

r_ShadersRemoteCompiler=1 —  включить дистанционную компиляцию шейдерного кэша.

r_ShaderCompilerServer=<IPv4> — указать IP сервера для дистанционной компиляции, но можно компилировать локально без стороннего сервера, указав локальный IP. Узнать локальный IP можно через командную строку Windows (cmd.exe) с помощью команды ipconfig.


Если будет применяться несколько серверов дистанционных компиляторов, то прописывать их IP через точку с запятой без пробела: r_ShaderCompilerServer=<IPv4>;<IPv4>

r_ShaderCompilerPort=<ShaderCompilerPort> — указать тот же порт, что и в config.ini. По умолчанию 31455 или 61453.

r_ShadersAsyncMaxThreads=8 — указать количество доступных потоков CPU для использования в расчётах.

r_driver=DX11 чтобы скомпилировать шейдеры под DX11 (ShaderList_PC.txt).

r_ShadersDX11=1

или

r_driver=GL чтобы скомпилировать шейдеры под OpenGL (ShaderList_GL4.txt).

r_ShadersGL4=1

За раз может генерироваться только набор под одну выбранную платформу (DX, OGL или под консоль). Платформа указывается в r_driver=


Осуществление компиляции.

Запускаем дистанционный компилятор шейдеров:

<Root your game>\Tools\RemoteShaderCompiler\CrySCompileServer.exe

Запускаем игру(!), а не через редактор, и проходим уровни, чтобы все возможные комбинации шейдеров были просчитаны. Если необходимые комбинации шейдеров не будут просчитаны, то объекты, использующие их, будут отображаться некорректно или не будут отображаться вовсе. Нужно пробежать все уровни на всех настройках графики и с применением (если будет использоваться) того или иного типа сглаживания (FXAA, MSAA и прочие).

После пробежки по уровням закрываем игру.

Шейдерный кэш сформирован.


Упаковка шейдерного кэша.

Теперь необходимо упаковать шейдерный кэш в shadercache.pak, shadercachestartup.pak и shadersbin.pak, чтобы применять шейдерный кэш в релизной сборке игры.

Есть два способа.

1. Основной способ с использованием PakShaders.bat.

Взять из <Root your game>\user\shaders каталог cache с скомпилированным шейдерным кэшем, который был создан дистанционным компилятором шейдерных комбинаций (Remote Shader Compiler), и запаковать его содержимое с помощью скрипта PakShaders.bat, который активирует запаковщик 7za.exe, в результате создающий shadercache.pak, shadercachestartup.pak и shadersbin.pak. Полученные паки необходимо будет разместить в <Root your game>\engine\.

Для начала необходимо скопировать из <Root CRYENGINE>\Tools\ PakShaders.bat и 7za.exe в каталог проекта/сборки игры <Root your game>\Tools\.

Для запуска PakShaders.bat потребуется создать bat-файл, который запустит PakShaders.bat. Напрямую его запускать нельзя, такова особенность работы скрипта. В данном примере «запускатор» назван PakShadersStart.bat (название не принципиально), его необходимо разместить в корне проекта/сборки игры, иначе PakShaders.bat сработает некорректно. Суть в том, что PakShadersStart.bat как бы обозначит корень проекта/сборки игры, от которого будет вестись работа скрипта PakShaders.bat.

Пример расположения PakShadersStart.bat:

С:\Programs\The Cursed Forest\PakShadersStart.bat

Пример содержимого PakShadersStart.bat:

"С:\Programs\The Cursed Forest\Tools\PakShaders.bat" d3d11

d3d11 — это каталог шейдерного кэша под DX11, который находится в <Root game>\user\shaders\cache. Для OGL будет GL4.

Примечание: Пути в bat-файле регистрозависимые!

Примечание: Путь писать полностью и в кавычках! Кавычки для корректного чтения интерпретатором.

Примечание: При выполнении можно столкнуться с ограничением Windows на количество символов в путях и именах. В этом случае придётся копировать каталоги user\shaders и Tools в каталог ближе к корню раздела.

Пример: C:\PakShaders\user\shaders и C:\PakShaders\Tools\

После описанных манипуляций запустить PakShadersStart.bat.

Должно появиться окно командной строки:


По завершению в корне проекта/сборки игры появятся shadercache.pak, shadercachestartup.pak и shadersbin.pak, которые необходимо поместить в <Root your game>\engine\ с заменой, если ранее использовались стандартные наборы шейдерного кэша.

2. Альтернативный способ с использованием ShaderCacheGen.exe.

Этот способ более сложный, поэтому рекомендую его использовать только в крайнем случае.

По данным из списка шейдерных комбинаций, который был создан дистанционным компилятором шейдерных комбинаций (Remote Shader Compiler), при помощи <Root>\bin\win_x64\ShaderCacheGen.exe перекомпилировать global shader cache, который будет упакован в shadercache.pak, shadercachestartup.pak и shadersbin.pak с использованием <Root>\Tools\PakShaders.bat и <Root>\Tools\7za.exe.

Для компилирования global shader cache понадобится список скомпилированных комбинаций шейдеров: <Root>\Tools\RemoteShaderCompiler\Assets\ShaderList_PC.txt

ShaderList_PC.txt — это список комбинаций шейдеров под DX11. Для OGL файл будет называться ShaderList_GL4.txt.

ShaderList_PC.txt нужно скопировать в <Root game>\user\shaders и переименовать в shaderlist.txt.

Для удобства компиляции файлов для shadercache.pak, shadercachestartup.pak и shadersbin.pak сделать bat-файл с командой <Root game>\bin\win_x64\ShaderCacheGen.exe -noprompt -anygpu /PrecacheShaderList

Примечание: bat-файл должен находиться в корне проекта/игры!

Примечание: Использовать абсолютный (полный) путь и заключить его в кавычки! Кавычки нужны для корректного чтения интерпретатором.

Примечание: Пути в bat-файле регистрозависимые!

Пример: С:\Programs\The Cursed Forest\bin\win_x64\ShaderCacheGen.exe -noprompt -anygpu /PrecacheShaderList

Примечание: дистанционный компилятор шейдеров <Root>\Tools\RemoteShaderCompiler\CrySCompileServer.exe должен быть включен!

Перед компиляцией комбинаций шейдеров через дистанционный компилятор шейдеров (Remote Shader Compiler) необходимо удалить старые паки с шейдерами из директории проекта/сборки игры, кроме shaders.pak:

<Root Game>\engine\

shadercache.pak

shadercachestartup.pak

shadersbin.pak

Запустить созданный bat-файл. Должна начаться компиляция.

Некоторые шейдеры могут быть не скомпилированы, чтобы убедиться, что всё нормально необходимо использовать r_displayinfo=2 и смотреть значение параметра промахов Global Cache Misses (GCM).

Файл <user>\Shaders\ShaderCacheMisses.txt должен быть пустой, что укажет на отсутствие промахов шейдеров = все шейдеры были взяты из шейдерного кэша и нет объектов, к которым не было загружено шейдера.

Бывает, что промахи есть, но не очевидно, как это устранить. Есть вероятность, что это очень незначительная комбинация и всё будет нормально без неё.

Далее упаковываем шейдерный кэш по первому способу с использованием <Root>\Tools\PakShaders.bat и <Root>\Tools\7za.exe

Настройка релизного system.cfg.

Примерный набор параметров:

sys_game_folder=Assets

sys_dll_game=CryGameSDK

sys_localization_folder=languages

s_AudioImplName=CryAudioImplWwise

sys_spec=3

sys_no_crash_dialog=1

sys_vr_support=0

log_IncludeTime=1

log_Verbosity=-1

r_shadersAsyncActivation=0

r_ShadersAsyncCompiling=0

r_ShadersAsyncMaxThreads=4

r_ShadersRemoteCompiler=0

r_ShaderCompilerServer=0.0.0.0

r_ShaderCompilerPort=31455

r_ShadersAllowCompilation=0

r_shadersSubmitRequestLine=0

r_ShadersUserFolder=0

r_driver=DX11

r_ShadersDX11=1

Первые два блока это типичные параметры для работы игры. По ним можно почитать в документации.

В третьем блоке выключаем компиляцию на ходу и применение Shaders Remote Compiler, тем самым активируя использование скомпилированного шейдерного кэша из shadercache.pak, shadercachestartup.pak и shadersbin.pak.

В четвёртом блоке указываем использовать скомпилированный шейдерный кэш под DX11.

На этом всё.


Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *