MAKE · WRITE · SHARE

UE4-PSOCache

原记录图解

旧版打包界面中的共享材质 Shader 代码与库选项

原笔记配图:旧版打包界面中的共享材质 Shader 代码与库选项。

构建生成的 stable shader key 文件示例

原笔记配图:构建生成的 stable shader key 文件示例;数量和命名不应固定推断。

收集运行中的 PSO 统计画面

原笔记配图:收集运行中的 PSO 统计画面。

运行时生成的 rec.upipelinecache 文件示例

原笔记配图:运行时生成的 rec.upipelinecache 文件示例。

把收集文件与 stable key 文件放入转换流程的旧目录示例

原笔记配图:把收集文件与 stable key 文件放入转换流程的旧目录示例。

转换后得到的 stable CSV 文件

原笔记配图:转换后得到的 stable CSV 文件。

按目标平台目录保存缓存输入的旧项目示例

原笔记配图:按目标平台目录保存缓存输入的旧项目示例。

1. 什么是PSO?

PSO(Pipeline State Object)是现代图形API(DX12、Vulkan、Metal)提出的新概念,以前的API设置VS、Rasterizer、PS、BlendState这些状态时,需要一个一个调用设置,PSO可以理解就是把这些状态封装为一个Object,一次调用SetPipelineState的API即可。

旧验收场景的 PSO 统计

原笔记配图:旧验收场景的 PSO 统计;出现缓存命中不代表覆盖了所有运行路径。

2. 为什么需要Cache PSO?

游戏在运行过程中,根据底层API,会有需要创建新的PSO对象的时候,这个创建的过程比较耗时,会导致卡顿。
PSO Cache 记录并组织可能需要的管线组合,让创建工作有机会提前或分批完成。创建时机、驱动缓存命中、并行度和设备都会改变实际耗时,因此不能说总创建时间恒定,也不保证所有卡顿都被消除。

stat pipelinecache可以看pso的状态,下图情况就是pso全部是cache预创建的,没有新生成的。

为什么需要Cache PSO?:stat pipelinecache可以看pso的状态,下图情况就是pso全部是cache预创建

3. PSOCache的收集过程

简单来说步骤就是:

  1. Cook 生成当前 Shader 库对应的稳定键数据(旧分支中为 .shk,数量与 Shader 库配置有关,不固定为两个)。

2.运行时生成.rec.upipelinecache文件(每次运行产生新的文件,这个就是跑图需要收集的PSOCache文件)

3.将两种文件合并为.stablepc.csv文件用于下一次打包

4.下次打包过程中生成.stable.upipelinecache文件到包内

5.游戏开始时加载.stable.upipelinecache初始化加载PSO

PSOCache的收集过程:5.游戏开始时加载.stable.upipelinecache初始化加载PSO

4. 增量收集PSO

知道了收集的过程,可以把出包、跑图生成文件、合并文件这些步骤做成自动化。

如何做增量收集?

原 UE4 分支保留兼容的 stable CSV 输入,按目标平台命名规则放到 Build/Windows/PipelineCaches 等对应路径,再由 Cook 流程合并。不同 Shader 库、引擎版本和平台文件不能直接混合。

增量收集PSO:原 UE4 分支保留兼容的 stable CSV 输入,按目标平台命名规则放到 Build/Wi

代码在UCookOnTheFlyServer::CreatePipelineCache里,读取多个.stable.csv,文件命名有严格要求。

增量收集PSO:代码在UCookOnTheFlyServer::CreatePipelineCache里,读取多

这样可以多个.stable.csv

增量收集PSO:这样可以多个.stable.csv

1. 版本与覆盖验收

以上为原 UE4 收集链路,文件扩展名、工具参数和命名规则需要与当次 Cook 的 Shader 库配套。UE5 的 PSO 预缓存与新收集机制不能直接套用这套命令。

跑图只覆盖实际走到的组合。需要测试主要材质、画质、粒子、阴影和动态状态,同时区分冷驱动缓存与热运行。统计中新建数为零只说明当前测试段没有观察到新建,不证明全项目覆盖完整。

PSO 固化的是一组管线状态,资源内容、描述符和部分动态状态仍单独管理。Shader 字节码已在包内,也不意味着对应 PSO 和驱动机器码已经完全准备好。

总结

增量收集的重点是输入兼容、命名可追溯与覆盖充分。预创建将一部分成本移出敏感时刻,但验收仍要结合实际冷启动、运行轨迹与卡顿来源。