WorldPartitionで制作した広大なフィールド上をランダムで移動して、PSOキャッシュを収集して、BundledPSOCacheとして利用しています。
フィールドで利用しているマテリアルが部分的にある程度の更新された場合に、PSOキャッシュを収集も再度行ってます。
ただ、ランダム移動でのPSOキャッシュの収集のため、毎回、同一のマテリアルで利用しているPSOキャッシュが収集できるとは限りません。
<br/>
こういうケースの場合に
古い.upipelinecache ファイルと新たに収集した.upipelinecache ファイルを両方つかって.spcファイルを生成したほうが、
BundledPSOCacheのカバレッジは高くなる可能性は高いのでしょうか?
また、この様に古い.upipelinecache ファイルをつかって.spcファイルをつくっていると無駄なBundledPSOCacheが増えるので、良くないなどあれば教えてほしいです。
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
<br/>
複数回のアプリケーションのテストケースを通じてPSOキャッシュを収集することは標準的な方法です。
懸念されている通りコンテンツの変化に伴い利用しなくなったシェーダーファイルが残り続けることがあるため
コンテンツに大きな変更が加わった場合、フレッシュなキャッシュを収集することで無駄なキャッシュを省くことができます。
パッケージ作成時のログに出力されるPSOのエントリ数に注目し、顕著に増加し続けるなどの異常がなければ問題ありません。
承知しました。
パッケージ作成時のログに出力されるPSOのエントリ数には、実際には古くて使われないものが含まれている場合もあるという認識で合っていますか?
> パッケージ作成時のログに出力されるPSOのエントリ数には、実際には古くて使われないものが含まれている場合もあるという認識で合っていますか?
はい。利用しているマテリアルに変更が加わった場合など、すでに利用されていないシェーダーのハッシュ値をPSOキャッシュファイルが保持してしまう可能性があります。
ランタイムではハッシュ値からシェーダーライブラリを検索して実際のシェーダーをロードするので、パッケージ内に存在しなくなったシェーダーはロードされないという動作になります。
すみません、何度も確認になってしまいますが、
BundledPSOCacheでパッケージに組み込んだPSOが大量にある場合、初回起動時でシェーダーコンパイルが長い時間発生すると思いますが、初回起動時シェーダーコンパイルの処理に、すでに利用されていない古いPSOはふくまれますか?
BundledPSOCacheに使われないPSOが多く含まれると、その分、初回起動時シェーダーコンパイルの処理が長くなるかが気になっています。
「すでに利用されていない古いPSO」がパッケージに含まれているなら、SHAハッシュからシェーダーがロードされコンパイルが走ります。
SHAハッシュに対応するシェーダーがすでにパッケージから除外されている場合は、シェーダーが見つからないためシェーダーがロードされることはありません。
対応するコードは UE::ShaderPipeline::CompileJob::PreloadShaders や FShaderLibrariesCollection::PreloadShader となるのでこれらの動作を確認いただくのが良いかと思います。