2017-11-10 2 views
0

Ich erstelle eine DirectX-Anwendung mit sharpdx und C#. Es funktioniert die meiste Zeit gut, aber manchmal bekomme ich diese Zufallsfehler:DXGI_ERROR_DEVICE_REMOVED

DXGI_ERROR_DEVICE_REMOVED

ich einige googeln, konnte aber keinen Grund, andere fein, als es mit meiner Onboard-HD-4400 oder dem Fahrer zu tun hat.

Es passiert, wenn ich einen Puffer erstellen möchte, tritt die Ausnahme auf. Das kann ich beim Debuggen sehen.

irgendwelche Ideen, was ich vergessen und kümmern muss? Scheint so zufällig. Ich entferne das Gerät nicht physisch. Könnte es etwas mit höherer Belastung und der Taktrate sein?

+0

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. –

Antwort

2

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