Shippingビルドで、起動時のシェーダーコンパイル待ちが短すぎる

お世話になっております。

ゲーム起動時にFShaderPipelineCache::NumPrecompilesRemaining()が0になるまで待つことで

シェーダーコンパイル処理の待ちをいれています。

Testのビルドで4分ほどかかる待ち時間がShippingにすると極端に短いので、起動時のシェーダーコンパイルが正常に動作しているか懸念があります。

妥当な時間でしょうか?

問題ある場合、Shipping時に追加で必要な設定などありますか?

<br/>

Testビルド:3分45秒

Shippingビルド:3秒

<br/>

[Attachment Removed]

お世話になっております。

妥当な時間かどうかはプロジェクト次第な点もありますが、Shippingの方が短くなる傾向にあります。ここまで差異があると正しくPSOキャッシュが効いているかどうか疑念があるかと思いますので、正しくキャッシュが効いているかどうかも踏まえて一度確認して頂けます幸いです。

・Shippingビルド動作時において、PSOキャッシュファイルが存在し多くのPSOが既にコンパイル済みであるケース

GetOrderedPSOHashes の AlreadyCompiledHashes(CompiledHashes)で既にコンパイル済みのPSOを除外します。もしNumPrecompilesRemaining()でコンパイル待ちを行っている場合、NumPrecompilesRemaining() はTotalActiveTasksとTotalWaitingTasksを返すので、既にコンパイル済みや除外されたPSOが多い場合、これらの値が小さくなることが想定されます。

・逆にTestビルド動作時において、PSOキャッシュファイルが存在しないまたは不完全なケース

OpenPipelineFileCache においてキャッシュファイルが存在しない場合、bGameFileOkはfalseになり、TOC.MetaDataは空になります。TOC.MetaDataが空または少ない場合、GetOrderedPSOHashesが返すPSOが少なくなり、実行時に多くのPSOをコンパイルする必要があります。

		const bool bGameFileOk = OpenPipelineFileCache(GamePath, ShaderPlatform, FileGuid, AsyncFileHandle, TOC, TOCOffset);
 
		if (bGameFileOk)
		{
			FilePath = GamePath;
			OutGameFileGuid = FileGuid;
			CacheStatus = EStatus::BundledCache;
		}

PSOキャッシュファイルが正しくパッケージされているか確認するには、PSOキャッシュの開始ログFShaderPipelineCacheTask::BeginPrecompilingPipelineCache() において、LogRHI の以下のログが出力されるので、キャッシュ状況をご確認頂ければと思います。

		UE_LOG(LogRHI, Display, TEXT("FShaderPipelineCache starting pipeline cache '%s' and enqueued %" INT64_FMT " tasks for precompile. (cache contains %d, %" INT64_FMT " eligible, %d had missing shaders. %d already compiled). BatchSize %d and BatchTime %f."),
			*PSOCacheKey, TotalPrecompileTasks, TotalPSOCount, EligibleTaskCount, MissingShaders, TotalPSOsCompiled, FShaderPipelineCache::BatchSize, FShaderPipelineCache::BatchTime);

以降、各コンパイル処理や完了処理は FShaderPipelineCache::BeginNextPrecompileCacheTaskInternal() で LogRHI を介して出力されますので、正しく動作しているか、コンパイル、完了が動作しているかをご確認ください。

[Attachment Removed]