从5.5到5.7都存在这个问题,但不是每台设备都出现。
复现步骤
- 使用默认设置创建一个新项目,直接打包。
- 启动项目并使其长时间闲置运行。(似乎在4k以上的大屏出现概率更高)
- 在 Windows 性能监视器(Private Bytes)中观察内存图表。
- 观察自定义日志输出随时间的变化。
从5.5到5.7都存在这个问题,但不是每台设备都出现。
复现步骤
具体出问题的代码在这里
// Copy over dirty handles to all other heaps so they are updated when reused as well
for (int32 GpuHeapIndex = 0; GpuHeapIndex < NumGpuHeaps; ++GpuHeapIndex)
{
//UE_LOG(LogD3D12RHI, Log, TEXT("GpuHeapIndex %d : %d dirty handles"), GpuHeapIndex, ActiveGpuHeaps[GpuHeapIndex].UpdatedHandles.Num());
if (GpuHeapIndex != ActiveGpuHeapIndex)
{
ActiveGpuHeaps[GpuHeapIndex].UpdatedHandles.Append(ActiveGpuHeaps[ActiveGpuHeapIndex].UpdatedHandles);// 当前活跃的ActiveGpuHeaps堆中的UpdatedHandles数组被追加到其他堆中
}
}
运行中的日志
6.03.30-03.15.36:841][441]LogD3D12RHI: GpuHeapIndex 0 : 4807 dirty handles
[2026.03.30-03.15.36:841][441]LogD3D12RHI: GpuHeapIndex 1 : 4798 dirty handles
[2026.03.30-03.15.36:841][441]LogD3D12RHI: GpuHeapIndex 2 : 3 dirty handles
[2026.03.30-03.15.36:841][441]LogD3D12RHI: GpuHeapIndex 3 : 672 dirty handles
[2026.03.30-03.15.36:841][441]LogD3D12RHI: GpuHeapIndex 4 : 665 dirty handles
[2026.03.30-03.15.36:841][441]LogD3D12RHI: GpuHeapIndex 5 : 212 dirty handles
[2026.03.30-03.15.36:883][442]LogD3D12RHI: GpuHeapIndex 0 : 4810 dirty handles
[2026.03.30-03.15.36:883][442]LogD3D12RHI: GpuHeapIndex 1 : 4801 dirty handles
[2026.03.30-03.15.36:883][442]LogD3D12RHI: GpuHeapIndex 2 : 3 dirty handles
[2026.03.30-03.15.36:883][442]LogD3D12RHI: GpuHeapIndex 3 : 105 dirty handles
[2026.03.30-03.15.36:883][442]LogD3D12RHI: GpuHeapIndex 4 : 668 dirty handles
[2026.03.30-03.15.36:883][442]LogD3D12RHI: GpuHeapIndex 5 : 215 dirty handles
…
2026.03.30-03.15.49:145][855]LogD3D12RHI: GpuHeapIndex 0 : 96381 dirty handles
[2026.03.30-03.15.49:145][855]LogD3D12RHI: GpuHeapIndex 1 : 96372 dirty handles
[2026.03.30-03.15.49:145][855]LogD3D12RHI: GpuHeapIndex 2 : 565 dirty handles
[2026.03.30-03.15.49:145][855]LogD3D12RHI: GpuHeapIndex 3 : 560 dirty handles
[2026.03.30-03.15.49:145][855]LogD3D12RHI: GpuHeapIndex 4 : 90 dirty handles
[2026.03.30-03.15.49:145][855]LogD3D12RHI: GpuHeapIndex 5 : 119 dirty handles
[2026.03.30-03.15.49:478][895]LogD3D12RHI: GpuHeapIndex 0 : 96500 dirty handles
[2026.03.30-03.15.49:478][895]LogD3D12RHI: GpuHeapIndex 1 : 96491 dirty handles
[2026.03.30-03.15.49:478][895]LogD3D12RHI: GpuHeapIndex 2 : 3 dirty handles
[2026.03.30-03.15.49:478][895]LogD3D12RHI: GpuHeapIndex 3 : 679 dirty handles
[2026.03.30-03.15.49:478][895]LogD3D12RHI: GpuHeapIndex 4 : 209 dirty handles
[2026.03.30-03.15.49:478][895]LogD3D12RHI: GpuHeapIndex 5 : 119 dirty handles
可以看到第0和1堆没有被正常回收,updatehandle在持续增长。随着数组越来越大,追加数据会导致严重的 CPU 线程卡顿,进而导致 GPU 超时 (TDR) 和崩溃。
可怕
不知道shipping模式下会不会也触发
(post deleted by author)
会的。4k以上大屏触发概率非常高