C# DXGI\u错误\u设备\u已删除

C# DXGI\u错误\u设备\u已删除,c#,directx,gpu,sharpdx,C#,Directx,Gpu,Sharpdx,我用sharpdx和c#创建了一个directx应用程序。 它在大多数情况下工作正常,但有时会出现以下随机错误: DXGI\u错误\u设备\u已删除 我在谷歌上搜索了一些,但除了与我的车载HD4400或驱动程序有关外,找不到其他原因 当我想创建一个缓冲区时,就会发生异常。我可以在调试时看到这一点 你知道我可能会忘记什么,需要关心什么吗?看起来很随意。我没有实际移除ofc设备。可能是负载和时钟频率更高的东西吗?DirectX应用程序需要在两个基本位置检测和处理“设备已删除”:当您转到“当前”时,可

我用sharpdx和c#创建了一个directx应用程序。 它在大多数情况下工作正常,但有时会出现以下随机错误:

DXGI\u错误\u设备\u已删除

我在谷歌上搜索了一些,但除了与我的车载HD4400或驱动程序有关外,找不到其他原因

当我想创建一个缓冲区时,就会发生异常。我可以在调试时看到这一点


你知道我可能会忘记什么,需要关心什么吗?看起来很随意。我没有实际移除ofc设备。可能是负载和时钟频率更高的东西吗?

DirectX应用程序需要在两个基本位置检测和处理“设备已删除”:当您转到“当前”时,可能会发生这种情况:

HRESULT hr = m_swapChain->Present(1, 0);

// If the device was reset we must completely reinitialize the renderer.
if (hr == DXGI_ERROR_DEVICE_REMOVED || hr == DXGI_ERROR_DEVICE_RESET)
{
    OnDeviceLost();
}
else
{
    DX::ThrowIfFailed(hr);
}
如果要调整现有交换链的大小,则可能会发生这种情况:

// If the swap chain already exists, resize it, otherwise create one.
if (m_swapChain)
{
    HRESULT hr = m_swapChain->ResizeBuffers(backBufferCount,
        backBufferWidth, backBufferHeight, backBufferFormat, 0);

    if (hr == DXGI_ERROR_DEVICE_REMOVED || hr == DXGI_ERROR_DEVICE_RESET)
    {
        // If the device was removed for any reason, a new device
        // and swap chain will need to be created.
        OnDeviceLost();
    }
    else
    {
        DX::ThrowIfFailed(hr);
    }
}
...
如果在其他情况下遇到
DXGI\u错误\u设备\u已删除
,则可能表明内部驱动程序错误,您应该查看是否有更新的驱动程序可用

在遗留的DIrect3D 9中,有一个类似的“设备丢失”的想法,但发生的频率要高得多。使用基于DXGI的API(Direct3D9Ex、Direct3D 10等),您只能在特定情况下移除设备。通常是因为系统在应用程序运行时更新了视频驱动程序。您可以通过在检测到它后调用
getDeviceMovedReason
来确定它被删除的原因

    if (hr == DXGI_ERROR_DEVICE_REMOVED || hr == DXGI_ERROR_DEVICE_RESET)
    {
#ifdef _DEBUG
        char buff[64] = {};
        sprintf_s(buff, "Device Lost on ResizeBuffers: Reason code 0x%08X\n",
        (hr == DXGI_ERROR_DEVICE_REMOVED) ? m_d3dDevice->GetDeviceRemovedReason() : hr);
        OutputDebugStringA(buff);
#endif

        ...
我知道的另一个“例外”情况是,如果您在非“开发人员模式”下调用,它将触发设备被删除。他们真的不希望你在“零售”游戏和应用程序中调用该功能


有关更多信息,请参见

DirectX应用程序预计将在两个基本位置检测和处理“设备已删除”:当您转到“显示”时,可能会发生这种情况:

HRESULT hr = m_swapChain->Present(1, 0);

// If the device was reset we must completely reinitialize the renderer.
if (hr == DXGI_ERROR_DEVICE_REMOVED || hr == DXGI_ERROR_DEVICE_RESET)
{
    OnDeviceLost();
}
else
{
    DX::ThrowIfFailed(hr);
}
如果要调整现有交换链的大小,则可能会发生这种情况:

// If the swap chain already exists, resize it, otherwise create one.
if (m_swapChain)
{
    HRESULT hr = m_swapChain->ResizeBuffers(backBufferCount,
        backBufferWidth, backBufferHeight, backBufferFormat, 0);

    if (hr == DXGI_ERROR_DEVICE_REMOVED || hr == DXGI_ERROR_DEVICE_RESET)
    {
        // If the device was removed for any reason, a new device
        // and swap chain will need to be created.
        OnDeviceLost();
    }
    else
    {
        DX::ThrowIfFailed(hr);
    }
}
...
如果在其他情况下遇到
DXGI\u错误\u设备\u已删除
,则可能表明内部驱动程序错误,您应该查看是否有更新的驱动程序可用

在遗留的DIrect3D 9中,有一个类似的“设备丢失”的想法,但发生的频率要高得多。使用基于DXGI的API(Direct3D9Ex、Direct3D 10等),您只能在特定情况下移除设备。通常是因为系统在应用程序运行时更新了视频驱动程序。您可以通过在检测到它后调用
getDeviceMovedReason
来确定它被删除的原因

    if (hr == DXGI_ERROR_DEVICE_REMOVED || hr == DXGI_ERROR_DEVICE_RESET)
    {
#ifdef _DEBUG
        char buff[64] = {};
        sprintf_s(buff, "Device Lost on ResizeBuffers: Reason code 0x%08X\n",
        (hr == DXGI_ERROR_DEVICE_REMOVED) ? m_d3dDevice->GetDeviceRemovedReason() : hr);
        OutputDebugStringA(buff);
#endif

        ...
我知道的另一个“例外”情况是,如果您在非“开发人员模式”下调用,它将触发设备被删除。他们真的不希望你在“零售”游戏和应用程序中调用该功能


有关更多信息,请参见“我的水晶球”中说,是您的代码导致视频驱动程序崩溃。这曾导致蓝屏死机,但如今操作系统足够聪明,知道如何重新加载驱动程序。在Windows事件日志中查找有关它的录制事件。我的水晶球说是你的代码导致视频驱动程序崩溃。这曾导致蓝屏死机,但如今操作系统足够聪明,知道如何重新加载驱动程序。在Windows事件日志中查找有关它的已记录事件。