2.9 KiB
2.9 KiB
title, date, excerpt, tags, rating
| title | date | excerpt | tags | rating |
|---|---|---|---|---|
| PSO Precache机制笔记 | 2025-02-08 20:42:16 | ⭐ |
前言
- 视频
- 文章
- [UE5.3] PSO Cache&PreCache 源码阅读:https://zhuanlan.zhihu.com/p/679832250
- [UE5.3] PSO Cache&PreCache 源码阅读(二):https://zhuanlan.zhihu.com/p/681803986
- Unreal Engine 5.2 MeshPass拓展:https://zhuanlan.zhihu.com/p/671423486
- 优化UE5的PSO卡顿:FileCache,PreCache和异步PSO https://zhuanlan.zhihu.com/p/1898646962561094034
BundledPSO
- 相关启动参数
- -logPSO
- -clearPSODriverCache
- 需要添加的配置
- RendererSettings
- r.ShaderPipelineCache.Enable=1
- DevOptions.Shaders
- NeedsSHaderStableKeys=true
- /Script/UnrealEd.ProjectPackagingSettings
- bShareMaterialShaderCode=True
- bSharedMaterialNativeLibraries=True
- RendererSettings
大致步骤
- 可选:使用快捷方式 -clearPSODriverCache,清空PSO。
- 添加上述配置。
- 执行Launch打包并且启动项目。
- 收集打包PSO:完成后可以在Saved/Metadata/PipelineCaches/找到打包的PSO文件,将其复制出来。
- 收集RuntimePSO:运行打包后的项目,跑测后在Saved/CollectedPSOs可以找到Runtime PSO文件,将其复制出来。
- 将所有收集的PSO放到一个制定的文件夹里,比如项目目录下PSOCollection,进行CommandLet
ShaderPipelineCacheTools,之后会生成制定名称的spc文件。 - 回到打包后的项目在指定平台的目录文件夹(在项目的Build文件夹下的Windows、Android)中新建文件夹PipelineCaches,并将spc文件放入。
- 重新使用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()