Ein DirectX-Anwendung wird erwartet, dass ‚Gerät entfernt‘ in zwei Grunde Orte zu erkennen und zu behandeln: Es kann passieren, wenn Sie zu Present
gehen:
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);
}
Und es kann passieren, wenn Sie einen vorhandenen swapchain, um die Größe gehen :
// 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);
}
}
...
wenn Sie DXGI_ERROR_DEVICE_REMOVED
in anderen Fällen auftreten, ist es wahrscheinlich, zeigt einen internen Treiberfehler und Sie sollen, wenn ein neuerer Treiber sehen verfügbar ist.
Zurück in der alten DIrect3D 9, gab es eine Idee von "Gerät verloren", die ähnlich war, aber mit viel häufiger passiert. Bei DXGI-basierten APIs (Direct3D9Ex, Direct3D 10 usw.) wird das Gerät nur in bestimmten Fällen entfernt. In der Regel liegt das daran, dass das System den Videotreiber aktualisiert hat, während die Anwendung ausgeführt wurde. Sie können tatsächlich feststellen, warum wurde entfernt, indem Sie GetDeviceRemovedReason
aufrufen, nachdem Sie es erkennen.
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.
mehr für Handle device removed scenarios in Direct3D 11
Meine Kristallkugel sehen, sagt, dass der Code den Videotreiber Absturz gemacht. Das führte früher zu einem Bluescreen-Tod, aber heute ist das Betriebssystem intelligent genug, um den Treiber neu laden zu können. Suchen Sie im Windows-Ereignisprotokoll nach einem aufgezeichneten Ereignis. –