Files
BlueRoseNote/03-UnrealEngine/Rendering/RenderingPipeline/PSO Precache机制笔记.md

3.1 KiB
Raw Blame History

title, date, excerpt, tags, rating
title date excerpt tags rating
PSO Precache机制笔记 2025-02-08 20:42:16

前言

BundledPSO

  • 相关启动参数
    • -logPSO
    • -clearPSODriverCache
  • 需要添加的配置
    • RendererSettings
      • r.ShaderPipelineCache.Enable=1
    • DevOptions.Shaders
      • NeedsSHaderStableKeys=true
    • /Script/UnrealEd.ProjectPackagingSettings
      • bShareMaterialShaderCode=True
      • bSharedMaterialNativeLibraries=True

PS.

  1. 可以使用UnitGraph查看CPU来判断是否有PSO正在编译。
  2. 理论上需要对所有伸缩性进行跑测来收集PSO。

大致步骤

  1. 可选:使用快捷方式 -clearPSODriverCache清空PSO。
  2. 添加上述配置。
  3. 执行Launch打包并且启动项目。
  4. 收集打包PSO完成后可以在Saved/Metadata/PipelineCaches/找到打包的PSO文件将其复制出来。
  5. 收集RuntimePSO运行打包后的项目跑测后在Saved/CollectedPSOs可以找到Runtime PSO文件将其复制出来。
  6. 将所有收集的PSO放到一个制定的文件夹里比如项目目录下PSOCollection进行CommandLetShaderPipelineCacheTools之后会生成制定名称的spc文件。
  7. 回到打包后的项目在指定平台的目录文件夹在项目的Build文件夹下的Windows、Android中新建文件夹PipelineCaches并将spc文件放入。
  8. 重新使用Launch打包完成后可以在log中知道spc文件中 pso数量。

将收集的PSO打包进Pak中

Engine\Binaries\Win64\UnrealEditor-Cmd.exe -run=ShaderPipelineCacheTools expand #Run ShaderPipelineCacheTools with expand optionl
Project\PSOCollection\*.rec.upipelinecache #Use all .rec.upipelinecache files
Project\PSOCollection\*.shk #Use all .shk files
Project\PSOCollection\PSO_SKGZombies_PCD3D_SM6.spc # Output PSO to be bundled

cmd /k #保证CMD开启
"D:\UnrealEngine\UE_5.6\Engine\Binaries\Win64\UnrealEditor-Cmd.exe" -run=ShaderPipelineCacheTools expand "D:\Project\Demo\PSOCollection\*.rec.upipelinecache" "D:\Project\Demo\PSOCollection\*.shk" "D:\Project\Demo\PSOCollection\PSO_Demo_PCD3D_SM6.spc"

执行链

  • FGraphEventArray UPrimitiveComponent::PrecachePSOs()
  • void UMaterialInterface::InitDefaultMaterials()
  • UMaterial::PrecachePSOs

UMaterial::PrecachePSOs => MaterialResource->CollectPSOs() => PrecacheMaterialPSOs() => PrecachePSOs() => CollectPSOs() => CollectPSOInitializers()

CollectPSOInitializers()

接口IPSOCollector::CollectPSOInitializers()

其他MeshProcessor实现