Freigeben über


Asynchrone Benachrichtigung (Direct3D 9)

Es gibt eine Reihe von interessanten Abfragen für einen Treiber, die eine Anwendung durchführen kann, wenn keine Leistungskosten anfallen. In Direct3D 7 und Direct3D 8 funktionierte der synchrone Abfragemechanismus GetInfo gut für Dinge wie Statistiken, aber es wurden keine leistungskritischen Abfragen hinzugefügt. Es gibt andere Dinge (z. B. Zäune), die von Natur aus asynchron sind. Dies ist eine einfache API für synchrone und asynchrone Abfragen. GetInfo wird in Direct3D 9 eingestellt.

Erstellen Sie eine Abfrage mit IDirect3DDevice9::CreateQuery. Diese Methode verwendet einen D3DQUERYTYPE, der definiert, welche Art von Abfrage ausgeführt werden soll, und gibt einen Zeiger auf ein IDirect3DQuery9-Objekt zurück. Wenn der Abfragetyp nicht unterstützt wird, gibt der Aufruf einen Fehler D3DERR_NOTAVAILABLE zurück. Mithilfe des Abfrageobjekts übermittelt die Anwendung die Abfrage mithilfe von IDirect3DQuery9::Issue an die Laufzeit und fragt die Abfrage status mit IDirect3DQuery9::GetData ab. Wenn das Abfrageergebnis verfügbar ist, wird S_OK zurückgegeben. Andernfalls wird S_FALSE zurückgegeben. Es wird erwartet, dass die Anwendung einen Puffer mit angemessener Größe für die Abfrageergebnisse übergibt.

Die Anwendung verfügt über eine Option, um zu erzwingen, dass die Runtime die Abfrage mithilfe von D3DGETDATA_FLUSH mit IDirect3DQuery9::GetData auf den Treiber leeren muss. Dies führt zu einer Leerung, wodurch der Treiber gezwungen wird, die Abfrage anzuzeigen. In diesem Fall wird D3DERR_DEVICELOST zurückgegeben, wenn das Gerät verloren geht.

Alle Abfragen gehen verloren, wenn das Gerät verloren geht. Die Anwendung muss sie neu erstellen. Wenn das Gerät die Abfrage nicht unterstützt und die pQueryID NULL ist, schlägt die Abfrageerstellung mit D3DERR_INVALIDCALL fehl.

In der folgenden Tabelle sind wichtige Informationen zu den einzelnen Abfragetypen zusammengefasst.

QuertyType Gültiges Problemflag GetData-Puffer Typ Impliziter Anfang der Abfrage
D3DQUERYTYPE_VCACHE D3DISSUE_END D3DDEVINFO_VCACHE Retail/Debug CreateDevice
D3DQUERYTYPE_ResourceManager D3DISSUE_END D3DDEVINFO_ResourceManager Nur Debuggen Anzahl
D3DQUERYTYPE_VERTEXSTATS D3DISSUE_END D3DDEVINFO_D3DVERTEXSTATS Nur Debuggen Anzahl
D3DQUERYTYPE_EVENT D3DISSUE_END BOOL Retail/Debug CreateDevice
D3DQUERYTYPE_OCCLUSION D3DISSUE_BEGIN,D3DISSUE_END DWORD Retail/Debug

 

Flags-Feld für IDirect3DQuery9::Issue:

#define D3DISSUE_END (1 << 0) 
// Tells the runtime to issue the end of a query, changing its state to 
//   "non-signaled" 
 
#define D3DISSUE_BEGIN (1 << 1) // Tells the runtime to issue the 
// beginning of a query. 

Flags-Feld für IDirect3DQuery9::GetData:

 
#define D3DGETDATA_FLUSH (1 << 0) // Tells the runtime to flush 
// if the query is outstanding.

Programmiertipps