Verlorene Geräte (Direct3D 9)
Ein Direct3D-Gerät kann sich entweder im Betriebszustand oder in einem verlorenen Zustand befinden. Der Betriebszustand ist der normaler Zustand des Geräts, in dem das Gerät ausgeführt wird, und stellt das gesamte Rendering wie erwartet dar. Das Gerät wechselt in den Verlorenen Zustand, wenn ein Ereignis, z. B. der Verlust des Tastaturfokus in einer Vollbildanwendung, dazu führt, dass das Rendern unmöglich wird. Der verlorene Zustand ist durch den automatischen Fehler aller Renderingvorgänge gekennzeichnet, was bedeutet, dass die Renderingmethoden Erfolgscodes zurückgeben können, obwohl die Renderingvorgänge fehlschlagen. In dieser Situation wird der Fehlercode D3DERR_DEVICELOST von IDirect3DDevice9::P resent zurückgegeben.
Der vollständige Satz von Szenarien, die dazu führen können, dass ein Gerät verloren gehen kann, ist nicht angegeben. Einige typische Beispiele sind Verlust des Fokus, z. B. wenn der Benutzer ALT+TAB drückt oder wenn ein Systemdialogfeld initialisiert wird. Geräte können auch aufgrund eines Energieverwaltungsereignisses oder wenn eine andere Anwendung den Vollbildmodus übernimmt, verloren gehen. 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 dem Geräteverlust verfügt jede Funktion im Allgemeinen über die folgenden drei Optionen:
- Fehler bei 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.
- Fehler im Hintergrund, zurückgeben S_OK oder andere 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 es von IDirect3DDevice9::P resent zurückgegeben wurde, funktioniert das Emulationsverhalten nicht mehr, und alle zukünftigen Aufrufe schlagen fehl, bis das Gerät erfolgreich zurückgesetzt wurde. Ein Direct3D 9Ex-Gerät gibt nie D3DERR_DEVICELOST zurück, sondern kann neue status Nachrichten 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. Andernfalls 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. 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 Ressourcen, die von den Methoden IDirect3DDevice9::CreateRenderTarget und IDirect3DDevice9::CreateDepthStencilSurface erstellt wurden.
Die Hochfrequenzaufrufe von Direct3D geben in den meisten Fällen 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 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.
Die Anwendung kann bestimmen, was beim Auftreten eines verlorenen Geräts zu tun ist, indem sie den Rückgabewert der IDirect3DDevice9::TestCooperativeLevel-Methode abfragt.
Sperrvorgänge
Intern leistet Direct3D genügend Arbeit, um sicherzustellen, dass ein Sperrvorgang nach dem Verlust eines Geräts erfolgreich ist. Es ist jedoch nicht garantiert, dass die Daten der Videospeicherressource während des Sperrvorgangs genau sind. Es wird garantiert, dass kein Fehlercode zurückgegeben wird. Dadurch können Anwendungen geschrieben werden, ohne sich um Geräteverluste während eines Sperrvorgangs zu kümmern.
Ressourcen
Ressourcen können Videospeicher verbrauchen. Da ein verloren gegangenes Gerät vom Videospeicher des Adapters getrennt ist, ist es nicht möglich, die Zuordnung des Videospeichers zu garantieren, wenn das Gerät verloren geht. Daher werden alle Methoden zur Ressourcenerstellung implementiert, um erfolgreich zu sein, indem D3D_OK zurückgegeben werden, aber tatsächlich nur Dummy-Systemspeicher zuweisen. Da jede Videospeicherressource zerstört werden muss, bevor die Größe des Geräts geändert wird, gibt es kein Problem mit der Überzuweisung von Videospeicher. Diese Dummyoberflächen ermöglichen es, dass Sperr- und Kopiervorgänge normal funktionieren, bis die Anwendung IDirect3DDevice9::P resent aufruft und feststellt, dass das Gerät verloren gegangen ist.
Der gesamte Videospeicher muss freigegeben werden, bevor ein Gerät von einem verlorenen Zustand auf einen Betriebszustand zurückgesetzt werden kann. Dies bedeutet, dass die Anwendung alle mit IDirect3DDevice9::CreateAdditionalSwapChain erstellten Swap chains und alle Ressourcen, die in der D3DPOOL_DEFAULT-Speicherklasse platziert sind, freigeben sollte. Die Anwendung muss keine Ressourcen in den D3DPOOL_MANAGED- oder D3DPOOL_SYSTEMMEM-Speicherklassen freigeben. Andere Zustandsdaten werden durch den Übergang in einen Betriebszustand automatisch zerstört.
Es wird empfohlen, Anwendungen mit einem einzigen Codepfad zu entwickeln, um auf Geräteverlust zu reagieren. Dieser Codepfad ist wahrscheinlich ähnlich, wenn nicht identisch mit dem Codepfad, der zum Initialisieren des Geräts beim Start verwendet wird.
Abgerufene Daten
Mit Direct3D können Anwendungen Textur- und Renderzustände mithilfe von IDirect3DDevice9::ValidateDevice anhand des Single-Pass-Renderings durch die Hardware überprüfen. Diese Methode, die normalerweise während der Initialisierung der Anwendung aufgerufen wird, gibt D3DERR_DEVICELOST zurück, wenn das Gerät verloren gegangen ist.
Direct3D ermöglicht Es Anwendungen auch, generierte oder zuvor geschriebene Bilder aus Videospeicherressourcen in nicht veränderliche Systemspeicherressourcen zu kopieren. Da die Quellimages solcher Übertragungen jederzeit verloren gehen können, 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, dass IDirect3DQuery9::GetData nie S_OK zurückgibt.
Der Kopiervorgang IDirect3DDevice9::GetFrontBufferData kann mit D3DERR_DEVICELOST fehlschlagen, da keine primäre Oberfläche vorhanden ist, wenn das Gerät verloren geht. IDirect3DDevice9::CreateAdditionalSwapChain kann auch mit D3DERR_DEVICELOST fehlschlagen, da beim Verlust des Geräts kein Rückpuffer erstellt werden kann. Beachten Sie, dass diese Fälle die einzigen instance von D3DERR_DEVICELOST außerhalb der Methoden IDirect3DDevice9::P resent, IDirect3DDevice9::TestCooperativeLevel und IDirect3DDevice9:Reset sind.
Programmierbare Shader
In Direct3D 9 müssen Vertex-Shader und Pixel-Shader nach dem Zurücksetzen nicht erneut erstellt werden. Sie werden in Erinnerung bleiben. In früheren Versionen von DirectX mussten für ein verlorenes Gerät Shader neu erstellt werden.
Zugehörige Themen