GPU crash detected: - Device 0 Removed: DXGI_ERROR_DEVICE_HUNG

2026年04月20日 00:03 processing

错误信息

[2026.04.19-03.04.57:621][732]LogD3D12RHI: Error: GPU crash detected: - Device 0 Removed: DXGI_ERROR_DEVICE_HUNG

AI 解决方案

报错分析报告

1.错误翻译


原文:Device 0 Removed: DXGI_ERROR_DEVICE_HUNG
译文:设备0已移除:DXGI_ERROR_DEVICE_HUNG(DirectX图形基础设施错误·设备挂起)

2. 原因分析


  • 根本原因:GPU设备因执行命令超时/陷入死锁,被Windows系统判定为“挂起”并强制移除。

  • 发生位置:D3D12 RHI(Direct3D 12渲染硬件接口)层的GPU崩溃检测逻辑,对应日志中的LogD3D12RHI

  • 上下文:应用程序向GPU提交的命令序列阻塞了图形管线,触发系统级设备重置。
  • 3. 解决方案


    需实现D3D12设备丢失恢复机制,以下是C++核心代码示例:
    #include <d3d12.h>
    #include <dxgi1_4.h>
    #include <wrl/client.h>
    using Microsoft::WRL::ComPtr;
    
    // 设备丢失时的恢复流程
    void HandleDeviceLost(ComPtr<IDXGIAdapter>& adapter, ComPtr<ID3D12Device>& oldDevice) {
        // 1. 释放旧设备关联资源(命令队列、资源、视图等)
        CleanupDeviceResources(oldDevice.Get());
    
        // 2. 重新创建设备(保持原适配器)
        ComPtr<ID3D12Device> newDevice;
        HRESULT hr = D3D12CreateDevice(
            adapter.Get(), 
            D3D_FEATURE_LEVEL_11_0, 
            IID_PPV_ARGS(&newDevice)
        );
        if (FAILED(hr)) throw std::runtime_error("Device recreation failed");
    
        // 3. 重建核心组件(命令队列、交换链、PSO等)
        RecreateCommandQueue(newDevice.Get());
        RecreateSwapChain(newDevice.Get());
        RecreatePipelineStateObjects(newDevice.Get());
    
        // 4. 恢复应用状态(重新加载纹理/缓冲区)
        RestoreAppResources(newDevice.Get());
    }
    
    // 调用时机:检测到DXGI_ERROR_DEVICE_HUNG时
    if (hr == DXGI_ERROR_DEVICE_HUNG) {
        HandleDeviceLost(m_adapter, m_device);
    }
    

    4.️ 预防措施


  • 实现设备丢失监听:在D3D12应用中定期检查IDXGISwapChain::GetLastPresentCount或捕获DXGI_ERROR_DEVICE_*错误码,主动触发恢复。

  • 优化GPU命令负载:用Nsight Graphics(NVIDIA)/ Radeon Profiler(AMD)分析命令执行时间,拆分长耗时任务(如大规模粒子渲染),避免阻塞管线。
  • ---
    :若需更具体的语言/框架适配,请补充完整报错栈信息。