关于RHICommandSetGraphicsPipelineState偶现耗时长问题

设备上出现了卡RHICommandSetGraphicsPipelineState,请问这可能是什么情况造成的。

[Image Removed]

[Image Removed]

[Image Removed]

设备信息:

​LogInit: Engine Version: 5.5.4-0+release

LogInit: Compatible Engine Version: 5.5.0-0+release

LogInit: Net CL: 0

LogInit: OS: Windows 10 (22H2) [10.0.19045.6456] (), CPU: Intel(R) Core™ i7-4770 CPU [Content removed] GPU: NVIDIA GeForce GTX 1060 3GB

LogInit: Compiled (64-bit): Nov 1 2025 01:19:51

LogInit: Architecture: x64

LogInit: Compiled with Visual C++: 19.44.35209.00

LogInit: Build Configuration: Test

LogD3D12RHI: Found D3D12 adapter 0: NVIDIA GeForce GTX 1060 3GB (VendorId: 10de, DeviceId: 1c02, SubSysId: 85b31043, Revision: 00a1

LogD3D12RHI: Max supported Feature Level 12_1, RHI Feature Level SM6, shader model 6.7, binding tier 3, wave ops supported, atomic64 supported

LogD3D12RHI: Adapter has 2965MB of dedicated video memory, 0MB of dedicated system memory, and 4064MB of shared system memory, 1 output[s]

LogD3D12RHI: Driver Version: 560.94 (internal:32.0.15.6094, unified:560.94)

LogD3D12RHI: Driver Date: 8-14-2024

Hi,

你好,从代码上看,这里应该就是直接设置调用d3d12 RHI的SetPipelineState,所以这里卡顿,我的理解应该还是驱动层的问题(从以前的一些经验来看,并不奇怪),我猜测可能的原因是驱动层在实际用到对应PSO的时候会真正在底层编译PSO(这也是我们有个r.PSOPrecache.KeepInMemoryUntilUsed,并且只在NV显卡上生效的原因)。

所以我觉得没有什么特别好的手段,可以考虑一些作弊行为,就是在loading或者某个UI阶段,尝试绘制一些物体,把pso及早编译出来,避免后续游戏的运行时卡顿。

二次启动会不会还有这种问题?也就是驱动层会缓存pso吗?

我感觉还是会有的,驱动层一般是会有Cache的(见ClearPSODriverCache函数),但是即便有了Driver的Cache,第二次编译的时间也还是可能会比较长。