お世話になっております。
妥当な時間かどうかはプロジェクト次第な点もありますが、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]