DXGI_ERROR_DEVICE_REMOVED
DXGI_ERROR_DEVICE_REMOVED
我使用 sharpdx 和 c# 创建了一个 directx 应用程序。
大多数时候它工作正常,但有时我会收到这个随机错误:
DXGI_ERROR_DEVICE_REMOVED
我用谷歌搜索了一些,但除了与我的板载 HD 4400 或驱动程序有关之外找不到其他原因。
当我想创建一个缓冲区时,出现异常。我在调试时可以看到。
有什么我可能忘记但需要关心的想法吗?看起来很随意。我没有物理删除设备 ofc。会不会是负载和时钟频率更高的东西?
DirectX 应用程序应在两个基本位置检测和处理 'device removed':当您转到 Present
:
时可能会发生这种情况
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_ERROR_DEVICE_REMOVED
,可能表示内部驱动程序错误,您应该查看是否有更新的驱动程序可用。
在遗留的 DIrect3D 9 中,有一个类似 'device lost' 的想法,但发生的频率更高。使用基于 DXGI 的 API(Direct3D9Ex、Direct3D 10 等),您只能在特定情况下删除设备。通常是因为系统更新了视频驱动程序 而 您的应用程序是 运行。你实际上可以确定为什么它在你检测到它之后通过调用GetDeviceRemovedReason
被删除。
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
...
The one other 'excepted' case I'm aware of is if you call ID3D12Device::SetStablePowerState while not in a "Developer Mode", it will trigger a device removed. They really don't want you to call that function in 'retail' games and apps.
我使用 sharpdx 和 c# 创建了一个 directx 应用程序。 大多数时候它工作正常,但有时我会收到这个随机错误:
DXGI_ERROR_DEVICE_REMOVED
我用谷歌搜索了一些,但除了与我的板载 HD 4400 或驱动程序有关之外找不到其他原因。
当我想创建一个缓冲区时,出现异常。我在调试时可以看到。
有什么我可能忘记但需要关心的想法吗?看起来很随意。我没有物理删除设备 ofc。会不会是负载和时钟频率更高的东西?
DirectX 应用程序应在两个基本位置检测和处理 'device removed':当您转到 Present
:
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_ERROR_DEVICE_REMOVED
,可能表示内部驱动程序错误,您应该查看是否有更新的驱动程序可用。
在遗留的 DIrect3D 9 中,有一个类似 'device lost' 的想法,但发生的频率更高。使用基于 DXGI 的 API(Direct3D9Ex、Direct3D 10 等),您只能在特定情况下删除设备。通常是因为系统更新了视频驱动程序 而 您的应用程序是 运行。你实际上可以确定为什么它在你检测到它之后通过调用GetDeviceRemovedReason
被删除。
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
...
The one other 'excepted' case I'm aware of is if you call ID3D12Device::SetStablePowerState while not in a "Developer Mode", it will trigger a device removed. They really don't want you to call that function in 'retail' games and apps.