Freigeben über


Verloren gegangene Geräte

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.

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 beim Zurücksetzen eines Geräts 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 einem Fehler "Gerät verloren" – Dies bedeutet, dass die Anwendung erkennen muss, dass das Gerät verloren gegangen ist, sodass die Anwendung erkennt, dass etwas nicht wie erwartet geschieht.
  • Automatisches Fehlschlagen, Zurückgeben von S_OK oder einem anderen Rückgabecode – Wenn eine Funktion im Hintergrund fehlschlägt, kann die Anwendung in der Regel nicht zwischen dem Ergebnis von "Erfolg" und einem "automatischen Fehler" unterscheiden.
  • Zurückgeben eines Rückgabecodes.

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. Das Zurücksetzen ist die einzige Prozedur, die auswirkungen hat, wenn ein Gerät verloren geht, und ist die einzige Möglichkeit, 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 zugeordneten Ressourcen frei, einschließlich Renderzielen und Tiefenschablonenoberflächen.

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, ohne eine Benachrichtigung über ein verlorenes Gerät zu erhalten. Intern werden diese Vorgänge verworfen, bis das Gerät auf den Betriebszustand zurückgesetzt 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.

Ressourcen

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 zum Erstellen von Ressourcen implementiert, um erfolgreich zu sein, 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 feststellt, 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. 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

Mit Direct3D können Anwendungen Textur- und Renderzustände anhand des Renderns durch die Hardware überprüfen.

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.

Kopiervorgänge können fehlschlagen, da es keine primäre Oberfläche gibt, wenn das Gerät verloren geht. Das Erstellen von Swapchains kann auch fehlschlagen, da kein Hintergrundpuffer erstellt werden kann, wenn das Gerät verloren geht.

Geräte