PSO入门和踩坑史

前言

管线状态对象(PSO)缓存工具可用于减轻虚幻引擎4关卡加载内容块时出现的卡顿,

比如在进游戏第一次开枪, 开枪的火花特效就会造成卡顿

这些现象在性能较弱的移动端尤其明显

本文简单记录一下PSO的整个流程, 目标平台Meta Quest2(Android), 版本4.27-plus

官网链接(4.27)

借用官网的图, 下面开始整个流程, 当中踩了不少坑, 一部分要归功于不是很有条理的官方文档

建议严格按照本文的笔记进行, 当中有不少容易踩的坑

收集缓存

要收集缓存的前提是为项目开启ShaderStableKeys

我们是在安卓平台的, 那么就要在Project\Config\Android\AndroidEngine.ini文件(没有就新建)内添加下面2行

1
2
[DevOptions.Shaders]
NeedsShaderStableKeys=true

如果不添加, 那么这一步的数据就得不到,

这里不得不提一下第一个坑, 来自官网的错误, 4.27已经将后缀为scl.csv的文件改成了shk

因为接下来要打包, 在打包之前添加几个渲染参数, 这个可以借鉴官网的方式

image-20230303141817574

image-20230303141922574

选择对应平台, 添加console变量, 图上的是必须的

还可以用同样方式添加额外的2个变量, 用于开启相关日志

1
2
r.ShaderPipelineCache.LogPSO=1
r.ShaderPipelineCache.SaveBoundPSOLog=1

或者, 直接把这些控制变量添加到DefaultEngine.ini

1
2
3
4
5
Config/DefaultEngine.ini
[ConsoleVariables]
r.ShaderPipelineCache.Enabled=1
r.ShaderPipelineCache.LogPSO=1
r.ShaderPipelineCache.SaveBoundPSOLog=1

接下来的目的是完成cook, 官网通过ProjectLaunchuer来cook, 如果你对此不熟悉, 那么完全可以用直接打包或者launcher游戏来进行

cook后会产生下面2个文件(项目图形api选的是vulkan)

image-20230303141502316

跑图

上面已经打包了, 接下来就是跑图, 尽量跑尽各个角落, 触发各个带材质的效果

然后就能在设备的游戏路劲内发现后缀为.rec.upipelinecache的一个文件, quest2的路径为下图

image-20230303142642280

拷贝出来, 可以将前面的2个,shk和这个文件放一起, 本案例都放在了E:\PSO

所以到这一步应该拥有下列3个文件

image-20230303142907062

生成csv

这一步的官方文档

接下来我们的利用引擎自己的command工具, 将上述3个文件生成一个新的csv文件, 这个文件记录了所有需要的shader信息

找到引擎 Engine\Binaries\Win64下的UE4Editor-Cmd.exe, 创建快捷方式,建议把这个快捷方式一起丢到我们的数据文件目录

接下来就是给快捷方式添加一串启动指令

又是坑, 按照官网说的输入命令保证就让人痛不欲生了

我这里最终的指令是如下,项目路径替换成自己的, E:/PSO/是放数据的路径

1
项目路径/NextVR.uproject -run=ShaderPipelineCacheTools expand E:/PSO/*.rec.upipelinecache E:/PSO/*.shk NextVR_SF_VULKAN_ES31_ANDROID.stablepc.csv

如果是图形是GL, 文件名称应该是项目名称_GLSL_ES3_1_ANDROID.stablepc.csv

运行以后生成如下文件

image-20230303143819832

这里很有可能没有在当前目录生成这个文件, 去引擎的Binaries/Win64下找

如果没有生成, 那一定是前面哪一步做错了

再次打包

到这里我们已经有了所需要的数据文件了

把这个.stablepc.csv文件放到Build\Android\PipelineCaches中,

注意: 这个路径只跟发布平台有关, 不管Android-ASTC还是其他都统一是Android

然后打包, 正常情况, 打包 的时候会出现若干条下面格式的日志

1
"Loaded %d shader info lines from %.*s."

如果没有报错, 那么打包就是成功了, 确保万无一失, 去设备的游戏路径下查看

Content下会出现一个新的叫PipelineCaches的文件夹, 里面有一个后缀是.stable.upipelinecache的数据文件, 这就对了

完成!