При профилировании потребовалось около 14 секунд только для компиляции шейдера. (Хотя загрузка всех этих файлов obj заняла всего 7 секунд.)
как я могу это оптимизировать? есть ли у меня возможность предварительно скомпилировать шейдеры hlsl?
На самом деле рекомендуется компилировать шейдеры в автономном режиме (во время сборки), а затем загружать полученный двоичный двоичный объект шейдера во время выполнения.
Вы можете использовать встроенную интеграцию Visual Studio HLSL, которая будет генерировать файлы .cso
(скомпилированный объект шейдера). Подробнее см. в Документы Майкрософт. Примечания по использованию Shader Model 6 DXC с VS см. в статье эта страница.
Вы можете использовать пакетный скрипт для вызова FXC или DXC из командной строки и использовать его как часть пользовательской сборки VS или пользовательских целей CMake. См. CompileShaders.cmd из набора инструментов DirectX и этот учебник.
Вам понадобится новый ctor для ваших классов шейдеров, перечисленных во фрагменте кода выше, который принимает двоичный объект шейдера напрямую, а не строку, в исходный код HLSL для компиляции.
For Win32 desktop applications, you need to handle the fact that your .cso files will end up next to your built EXE instead of where you have your project CWD set. See ReadData for an example of this. For UWP and Xbox apps, the .cso files are placed into the appx package automatically.
From your question, it's not clear if you are using the legacy
FXC.EXE
compiler with Shader Model 5.1 or the current DirectX 12 shaderDXC.EXE
for Shader Model 6. Still the same advice applies here. FWIW, the DXC compiler is LLVM based so it's a bit more complex and therefore does more analysis than the legacy FXC compiler did.
Что ж, в Visual Studio есть встроенный компилятор hlsl, вы его пробовали? Но все же 14 секунд кажутся слишком длинными для такого количества шейдеров.