こちらのページを参考に、バンドルPSOキャッシュのワークフローを作成しようと考えておりますが、PSOキャッシュ変換の際、D3D12、D3D11両方をサポートするタイトルの場合、~PCD3D_SM6.shkと~PCD3D_SM5.shkどちらも同じディレクトリにおいて.spcファイルを作成するのでしょうか?この場合、(ShaderFormatName)はどのように指定すればよいのでしょうか?
こちらのページを参考に、バンドルPSOキャッシュのワークフローを作成しようと考えておりますが、PSOキャッシュ変換の際、D3D12、D3D11両方をサポートするタイトルの場合、~PCD3D_SM6.shkと~PCD3D_SM5.shkどちらも同じディレクトリにおいて.spcファイルを作成するのでしょうか?この場合、(ShaderFormatName)はどのように指定すればよいのでしょうか?
お世話になっております。
手動で PSOCollector やその他のコマンドレットを使用してバンドルされた PSO キャッシュを作成する場合、対象とするキャッシュに応じて、各シェーダープラットフォームごとに ShaderFormatName を指定する必要があります。
たとえば:
D3D11 の場合:
ShaderFormatName=PCD3D_SM5を使用します。
D3D12 の場合:
ShaderFormatName=PCD3D_SM6を使用します。
これらは通常、CookやCreateShaderArchiveコマンドレットを実行する際に、-shaderformatsパラメータに渡されます。
RunUAT.bat BuildCookRun -project=“Path\To\Your.uproject” -targetplatform=Win64 -cook -map=/Game/YourMap \
-shaderformats=PCD3D_SM5+PCD3D_SM6 -compile -compressed
または、別々に実行する場合は以下のようになります:
RunUAT.bat CreateShaderArchive -project=“Path\To\Your.uproject” -platform=Win64 -ShaderFormats=PCD3D_SM6
RunUAT.bat CreateShaderArchive -project=“Path\To\Your.uproject” -platform=Win64 -ShaderFormats=PCD3D_SM5
お手数ですが、よろしくお願いします。
ShaderPipelineCacheToolsを実行する際に、アプリケーションがD3D12、D3D11両方をサポートするタイトルの場合、~PCD3D_SM6.shkと~PCD3D_SM5.shkはそれぞれ分けて作成して、二つのファイルをクックするということでしょうか?
例えばDirectX12用として
Engine\Binaries\Win64\UnrealEditor-Cmd.exe -run=ShaderPipelineCacheTools expand C:\PSOCache\*.rec.upipelinecache C:\PSOCache\*PCD3D_SM6.shk C:\PSOCache\[YourPrefix][ProjectName]PCD3D_SM6.spc
DirectX11用として
Engine\Binaries\Win64\UnrealEditor-Cmd.exe -run=ShaderPipelineCacheTools expand C:\PSOCache\*.rec.upipelinecache C:\PSOCache\*PCD3D_SM5.shk C:\PSOCache\[YourPrefix][ProjectName]PCD3D_SM5.spc
それぞれ用の.spcを作り、二つのspcを Build/Windows/PipelineCachesに格納してクック~パッケージ化すればよい、ということでしょうか?
お世話になっております。
はい、両方の質問にかんしてはその通りになると思います。
よろしくお願いします。
ありがとうございます。
もう一つお聞きしたいのですが、最終的に.spcファイルを含めて作成する製品パッケージですが、こちらで必要なminimumの.iniファイルのセッティングはどうなるのでしょうか?
例えば r.ShaderPipelineCache.Enabled は 1に設定しないといけない気がしますが、NeedsShaderStableKeysは特に設定する必要がないように思っています
はい、バンドルされた.spcファイルを製品ビルドで正しく使用するには、以下の最小限の.ini設定が必要です。
これらの設定により、PSOシステムが有効になり、起動時にキャッシュが読み込まれるようになります。
NeedsShaderStableKeysは、ランタイムでのログ収集や安定キーによるキャッシュ生成を行わない場合は、特に設定する必要がないかと思います。
こちらのドキュメントに役に立てる情報があるので、是非ご覧ください。
お手数ですが、よろしくお願いします。
回答ありがとうございます。少し質問の仕方が良くなかったので、もう少し具体的に書きますと、PSO Precaching システムと、 Bundled PSO システムを、製品版パッケージで正しく動作させるためには、.iniファイルに以下の設定をするのが、必要かつ十分であるという理解でよろしいでしょうか?
(例えばデバッグ情報が載ってしまったり、パフォーマンスに影響がある、といったことが無いかどうか)
<DefaultEngine.ini>
[DevOptions.Shaders]
NeedsShaderStableKeys=true
[/Script/Engine.RendererSettings]
r.PSOPrecaching=1
r.PSOPrecache.ProxyCreationWhenPSOReady=1
r.ShaderPipelineCache.ExcludePrecachePSO=1
r.PSOPrecache.Validation=2
r.PSOPrecache.GlobalShaders=1
<DefaultGame.ini>
bShareMaterialShaderCode=True
bSharedMaterialNativeLibraries=True
追記させていただきますと、
>NeedsShaderStableKeysは、ランタイムでのログ収集や安定キーによるキャッシュ生成を行わない場合は、特に設定する必要がないかと思います。
との回答を頂いておりますが、こちらを付けずにパッケージをCook/Buildした場合、
こちらのページにあります、
LogShaderPipelineCacheTools: Display: **Wrote 35381 binary PSOs** (graphics: 34834 compute: 547 RT: 0), (18453KB) to d:/build/++Test/Sync/TestGame/Saved/Cooked/WindowsClient/TestGame/Content/PipelineCaches/Windows/TestGame_PCD3D_SM6.stable.upipelinecache LogCook: Display: ---- Done running UShaderPipelineCacheToolsCommandlet for platform WindowsClient
この行がビルドログに現れていないため、アプリケーションにPSOがバンドルできていないように思います。このため、こちらのオプションは製品版パッケージにも必要なのではないでしょうか?
お手数をおかけしますがご確認よろしくお願いします。
お世話になっております。
申し訳ございません、勘違いしました。再確認しましたら、NeedsShaderStableKeysを必ずTrueにしなきゃいけないです。すみませんでした。
`<DefaultEngine.ini>
[DevOptions.Shaders]
NeedsShaderStableKeys=true
[/Script/Engine.RendererSettings]
r.PSOPrecaching=1
r.PSOPrecache.ProxyCreationWhenPSOReady=1
r.ShaderPipelineCache.ExcludePrecachePSO=1
r.PSOPrecache.Validation=2
r.PSOPrecache.GlobalShaders=1
<DefaultGame.ini>
bShareMaterialShaderCode=True
bSharedMaterialNativeLibraries=True`で問題がないかと思います。不具合か不安点があればいつでも質問してください。
よろしくお願いします。
回答ありがとうございます!
NeedsShaderStableKeys=true
にした場合、ランタイムのメモリ利用量が600MBほど増加する(キャッシュ量によるとは思います)ようなのですが、こちらはそういうものなのでしょうか?
結構大きい量なので、もしそうなのであれば、Prefetch PSOのみの利用を考えるべきかと考えています。
お疲れ様です。
今調べているため、もうしばらくお待ちください。
お世話になっております。
これはバンドルキャッシュの構築中にシェーダーハッシュを再マッピングするためのものですが、なぜサイズがこれほど大きくなるのか分かりません。
具体的にはどのメモリが増加するのでしょうか?
ランタイム使用メモリでしょうか?
その数値はどこで確認したのでしょうか?
精確な状況をお伝えしますと、
`[DevOptions.Shaders]
NeedsShaderStableKeys=true
[/Script/Engine.RendererSettings]
r.ShaderPipelineCache.Enabled=1
r.PSOPrecaching=1
r.PSOPrecache.ProxyCreationWhenPSOReady=1
r.ShaderPipelineCache.ExcludePrecachePSO=1
r.PSOPrecache.Validation=2`↑のオプションがある場合で、3.6Gほど、無い場合で2.8Gほど、メインメモリを消費します。
.spcファイルをパッケージに含めても、含めなくても、結果は変わりません。
メインメモリの確認は
FPlatformMemory::GetStats().UsedPhysical
こちらを利用しています。
UEのバージョンは5.5.1を使用しています。Testビルドで測定しています。
よろしくお願いします。
お世話になっております。
NeedsShaderStableKeys は実行時のスイッチではなく、クック時の動作にのみ影響します。つまり「安定したシェーダーキーを使わずに再クックすると、実行時のメモリ消費が抑えられる」という理解で合っていますか?
安定キーの生成を無効にすると、クック時にバンドルキャッシュが作られなくなります(ログ出力で確認できます)。インクリメンタルクックでない限り、.shkファイルは読み込まれないはずです。
ビルド間の比較でもいいですし、単にクックログにドキュメンテーションのセクション(“ShaderStableInfo” という文字列)が含まれているかを見てもらっても大丈夫です。
このキャッシュが読み込まれず、そこから PSO の事前キャッシュが行われないことで、メモリ使用量に差が出ている可能性があります(ちなみに安定キーのファイルには感度の高いアセット名が含まれるため、クック済みビルドには含まれませんし、読み込まれることもありません)。
バンドルキャッシュが効いていた場合は、メモリ使用量が下がる代わりにスタッターが増えるはずです。もし明らかなスタッター増加がなく、全体としてメリットしか感じられないなら(ドライバキャッシュはクリアした状態でご確認ください)、バンドルキャッシュは無効化してしまっても問題ないと思います。
回答ありがとうございます。
以前の質問に書いた、
`[DevOptions.Shaders]
NeedsShaderStableKeys=true
[/Script/Engine.RendererSettings]
r.ShaderPipelineCache.Enabled=1
r.PSOPrecaching=1
r.PSOPrecache.ProxyCreationWhenPSOReady=1
r.ShaderPipelineCache.ExcludePrecachePSO=1
r.PSOPrecache.Validation=2`こちらを、DefaultEngine.iniファイルに含めてクックした場合と、含めずにクックした場合で、アプリケーション実行時の使用メモリに差異がある、という意味です。
キャッシュが読み込まれて使用量に差が出ている、のはもちろんその通りだと思いますし、バンドルキャッシュのメリットも理解しております。
が、例えば.spcキャッシュが Build/Windows/PipelineCaches/ に存在する、しないに関わらず(つまり、spcのサイズに依らず) メモリを消費しており、かつそれが割と容量としては大きい(およそ1GB)ため、正常な動作かどうかを確認したかった、ということです。
もちろん、バンドルキャッシュを使用している際に、ドキュメントの通りにShaderStableInfoの行が表示され、PSOバンドルキャッシュが組み込まれていることは確認済みです
よろしくお願いします。
お世話になっております。
ご確認いただき、ありがとうございます。
現時点の情報を見る限り、このメモリの差異は正常な動作とは考えにくいと思います。
差異がどこから生じているのかは判然としない部分もありますが、お時間が許すようでしたら、そのデルタがどこから来ているのかを調査する価値はあるかと存じます。
その際は、ぜひご相談させていただけますと幸いです。