FD3D12BindlessResourceManager::CheckRequestNewActiveGPUHeap()中UpdatedHandles数组持续膨胀

从5.5到5.7都存在这个问题,但不是每台设备都出现。
复现步骤

  1. 使用默认设置创建一个新项目,直接打包。
  2. 启动项目并使其长时间闲置运行。(似乎在4k以上的大屏出现概率更高)
  3. 在 Windows 性能监视器(Private Bytes)中观察内存图表。
  4. 观察自定义日志输出随时间的变化。

在unreal insight中,发现是FD3D12BindlessResourceManager::CheckRequestNewActiveGPUHeap一直在申请内存,而且耗时很长

具体出问题的代码在这里

// 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) 和崩溃。

可怕 :anxious_face_with_sweat: 不知道shipping模式下会不会也触发

(post deleted by author)

会的。4k以上大屏触发概率非常高