Freigeben über


Verlorene Geräte (Direct3D 9)

Ein Direct3D-Gerät kann sich entweder in einem Betriebszustand oder in einem verlorenen Zustand befinden. Der Betriebszustand ist der normale Zustand des Geräts, in dem das Gerät ausgeführt wird und das gesamte Rendering wie erwartet darstellt. Das Gerät macht einen Übergang zum verlorenen Zustand, wenn ein Ereignis, z. B. der Verlust des Tastaturfokus in einer Vollbildanwendung, das Rendern unmöglich wird. Der verlorene Zustand zeichnet sich durch den automatischen Fehler aller Renderingvorgänge aus. Dies bedeutet, dass die Renderingmethoden Erfolgscodes zurückgeben können, auch wenn die Renderingvorgänge fehlschlagen. In diesem Fall wird der fehlercode D3DERR_DEVICELOST von IDirect3DDevice9::P resentzurückgegeben.

Standardmäßig wird der vollständige Satz von Szenarien, die dazu führen können, dass ein Gerät verloren geht, nicht angegeben. Einige typische Beispiele sind ein Fokusverlust, z. B. wenn der Benutzer ALT+TAB drückt oder ein Systemdialogfeld initialisiert wird. Geräte können auch aufgrund eines Energieverwaltungsereignisses verloren gehen, oder wenn eine andere Anwendung den Vollbildbetrieb übernimmt. Darüber hinaus versetzt jeder Fehler von IDirect3DDevice9::Reset das Gerät in einen verlorenen Zustand.

Alle Methoden, die von IUnknown abgeleitet werden, funktionieren garantiert, nachdem ein Gerät verloren gegangen ist. Nach Geräteverlust hat jede Funktion im Allgemeinen die folgenden drei Optionen:

  • Fehler mit D3DERR_DEVICELOST – Dies bedeutet, dass die Anwendung erkennen muss, dass das Gerät verloren gegangen ist, damit die Anwendung erkennt, dass etwas nicht wie erwartet geschieht.
  • Automatisches Fehlschlagen, Zurückgeben von S_OK oder anderen Rückgabecodes – Wenn eine Funktion im Hintergrund fehlschlägt, kann die Anwendung in der Regel nicht zwischen dem Ergebnis von "Erfolg" und einem "automatischen Fehler" unterscheiden.
  • Die Funktion gibt einen Rückgabecode zurück.
Unterschiede zwischen Direct3D 9 und Direct3D 9Ex:
Ein Direct3D 9-Gerät gibt D3DERR_DEVICELOST zurück. Nachdem sie von IDirect3DDevice9::P resentzurückgegeben wurde, funktioniert das Emulationsverhalten nicht mehr, und alle zukünftigen Aufrufe treten erst dann fehl, wenn das Gerät erfolgreich zurückgesetzt wird.
Ein Direct3D 9Ex-Gerät gibt niemals D3DERR_DEVICELOST zurück, kann aber neue Statusmeldungen zurückgeben (siehe Änderungen des Geräteverhaltens).

 

Reagieren auf ein verlorenes Gerät

Ein verloren gegangenes Gerät muss Ressourcen (einschließlich Videospeicherressourcen) neu erstellen, nachdem es zurückgesetzt wurde. Wenn ein Gerät verloren geht, fragt die Anwendung das Gerät ab, um festzustellen, ob es in den Betriebszustand wiederhergestellt werden kann. Wenn nicht, wartet die Anwendung, bis das Gerät wiederhergestellt werden kann.

Wenn das Gerät wiederhergestellt werden kann, bereitet die Anwendung das Gerät vor, indem alle Videospeicherressourcen und alle Swapchains zerstört werden. Anschließend ruft die Anwendung die IDirect3DDevice9::Reset-Methode auf. Das Zurücksetzen ist die einzige Methode, die auswirkungen hat, wenn ein Gerät verloren geht, und ist die einzige Methode, mit der eine Anwendung das Gerät von einem Verlorenen in einen Betriebszustand ändern kann. Das Zurücksetzen schlägt fehl, es sei denn, die Anwendung gibt alle Ressourcen frei, die in D3DPOOL_DEFAULT zugeordnet sind, einschließlich der von der IDirect3DDevice9::CreateRenderTarget und IDirect3DDevice9::CreateDepthStencilSurface Methoden.

In den meisten Fällen geben die Hochfrequenzaufrufe von Direct3D keine Informationen darüber zurück, ob das Gerät verloren gegangen ist. Die Anwendung kann weiterhin Renderingmethoden aufrufen, z. B. IDirect3DDevice9::D rawPrimitive, ohne Benachrichtigung über ein verlorenes Gerät zu erhalten. Intern werden diese Vorgänge verworfen, bis das Gerät auf den Betriebszustand zurückgesetzt wird.

Die Anwendung kann bestimmen, was beim Auftreten eines verlorenen Geräts zu tun ist, indem der Rückgabewert der IDirect3DDevice9::TestCooperativeLevel-Methode abgefragt wird.

Sperrvorgänge

Intern funktioniert Direct3D ausreichend, um sicherzustellen, dass ein Sperrvorgang erfolgreich ausgeführt wird, nachdem ein Gerät verloren gegangen ist. Es ist jedoch nicht garantiert, dass die Daten der Videospeicherressource während des Sperrvorgangs korrekt sind. Es wird sichergestellt, dass kein Fehlercode zurückgegeben wird. Auf diese Weise können Anwendungen ohne Bedenken für Geräteverluste während eines Sperrvorgangs geschrieben werden.

Betriebsmittel

Ressourcen können Videospeicher verbrauchen. Da ein verlorenes Gerät vom Videospeicher im Besitz des Adapters getrennt wird, ist es nicht möglich, die Zuweisung des Videospeichers zu gewährleisten, wenn das Gerät verloren geht. Daher werden alle Methoden für die Ressourcenerstellung implementiert, um erfolgreich zu sein, indem D3D_OK zurückgegeben werden, aber weisen Sie tatsächlich nur Dummy-Systemspeicher zu. Da jede Videospeicherressource zerstört werden muss, bevor die Größe des Geräts geändert wird, besteht kein Problem beim Überlasten des Videospeichers. Mit diesen Dummyoberflächen können Sperr- und Kopiervorgänge normal funktionieren, bis die Anwendung IDirect3DDevice9::P resent aufruft und erkennt, dass das Gerät verloren gegangen ist.

Der gesamte Videospeicher muss freigegeben werden, bevor ein Gerät aus einem verlorenen Zustand in einen Betriebszustand zurückgesetzt werden kann. Dies bedeutet, dass die Anwendung alle Swapchains freigeben sollte, die mit IDirect3DDevice9::CreateAdditionalSwapChain erstellt wurden, sowie alle Ressourcen, die in der D3DPOOL_DEFAULT Speicherklasse platziert wurden. Die Anwendung benötigt keine Ressourcen in den D3DPOOL_MANAGED oder D3DPOOL_SYSTEMMEM Speicherklassen freizugeben. Andere Zustandsdaten werden automatisch durch den Übergang zu einem Betriebszustand zerstört.

Sie werden ermutigt, Anwendungen mit einem einzigen Codepfad zu entwickeln, um auf Geräteverluste zu reagieren. Dieser Codepfad ist wahrscheinlich ähnlich, wenn nicht identisch, mit dem Codepfad, der zum Initialisieren des Geräts beim Start verwendet wurde.

Abgerufene Daten

Direct3D ermöglicht Es Anwendungen, Textur- und Renderzustände anhand des Renderns durch die Hardware mit IDirect3DDevice9::ValidateDevicezu überprüfen. Diese Methode, die in der Regel während der Initialisierung der Anwendung aufgerufen wird, gibt D3DERR_DEVICELOST zurück, wenn das Gerät verloren gegangen ist.

Mit Direct3D können Anwendungen auch generierte oder zuvor geschriebene Bilder aus Videospeicherressourcen in nicht volatile Systemspeicherressourcen kopieren. Da die Quellimages solcher Übertragungen jederzeit verloren gehen, ermöglicht Direct3D, dass solche Kopiervorgänge fehlschlagen, wenn das Gerät verloren geht.

Bei asynchronen Abfragen gibt IDirect3DQuery9::GetData- D3DERR_DEVICELOST zurück, wenn das FLUSH-Flag angegeben ist, um der Anwendung anzugeben, die IDirect3DQuery9::GetData- nie S_OK zurückgibt.

Der Kopiervorgang IDirect3DDevice9::GetFrontBufferDatakann mit D3DERR_DEVICELOST fehlschlagen, da beim Verlust des Geräts keine primäre Oberfläche vorhanden ist. IDirect3DDevice9::CreateAdditionalSwapChain- kann auch mit D3DERR_DEVICELOST fehlschlagen, da ein Hintergrundpuffer nicht erstellt werden kann, wenn das Gerät verloren geht. Beachten Sie, dass es sich bei diesen Fällen um die einzige Instanz von D3DERR_DEVICELOST außerhalb des IDirect3DDevice9::P resent, IDirect3DDevice9::TestCooperativeLevelund IDirect3DDevice9::Reset Methoden handelt.

Programmierbare Shader

In Direct3D 9 müssen Vertex-Shader und Pixelshader nach dem Zurücksetzen nicht erneut erstellt werden. Sie werden sich erinnern. In früheren Versionen von DirectX musste ein verloren gegangenes Gerät neu erstellt werden.

Direct3D-Geräte