Delen via


Asynchrone melding (Direct3D 9)

Er zijn een aantal interessante query's op een stuurprogramma dat door een toepassing kan worden uitgevoerd als er geen prestatiekosten zijn. In Direct3D 7 en Direct3D 8 werkte een synchrone querymechanisme, GetInfo, goed voor zaken als statistieken, maar er zijn geen prestatiekritieke query's toegevoegd. Er zijn andere dingen (zoals hekken) die inherent asynchroon zijn. Dit is een eenvoudige API om zowel synchrone als asynchrone query's te maken. GetInfo wordt buiten gebruik gesteld in Direct3D 9.

Een query maken met IDirect3DDevice9::CreateQuery. Deze methode gebruikt een D3DQUERYTYPE, waarmee wordt gedefinieerd welk type query moet worden uitgevoerd en waarmee een aanwijzer wordt geretourneerd naar een IDirect3DQuery9--object. Als het querytype niet wordt ondersteund, retourneert de aanroep een fout D3DERR_NOTAVAILABLE. Met behulp van het queryobject verzendt de toepassing de query naar de runtime met behulp van IDirect3DQuery9::Issueen pollt de querystatus met behulp van IDirect3DQuery9::GetData. Als het queryresultaat beschikbaar is, wordt S_OK geretourneerd; anders wordt S_FALSE geretourneerd. De toepassing zal naar verwachting een buffer met de juiste grootte doorgeven voor de queryresultaten.

De toepassing heeft een optie om de runtime af te dwingen om de query naar het stuurprogramma te verwijderen met behulp van D3DGETDATA_FLUSH met IDirect3DQuery9::GetData. Het veroorzaakt een leegmaken, waardoor het stuurprogramma de query kan zien. In dit geval wordt D3DERR_DEVICELOST geretourneerd als het apparaat verloren gaat.

Alle query's gaan verloren wanneer het apparaat verloren gaat. De toepassing moet deze opnieuw maken. Als het apparaat de query niet ondersteunt en de pQueryID is NULL-, mislukt het maken van de query met D3DERR_INVALIDCALL.

De volgende tabel bevat belangrijke informatie over elk querytype.

QuertyType Geldige vlag voor probleem GetData-buffer Runtime Impliciet begin van query
D3DQUERYTYPE_VCACHE D3DISSUE_END D3DDEVINFO_VCACHE Detailhandel/foutopsporing CreateDevice
D3DQUERYTYPE_ResourceManager D3DISSUE_END D3DDEVINFO_ResourceManager Alleen fouten opsporen Aanwezig
D3DQUERYTYPE_VERTEXSTATS D3DISSUE_END D3DDEVINFO_D3DVERTEXSTATS Alleen fouten opsporen Aanwezig
D3DQUERYTYPE_EVENT D3DISSUE_END BOOL Detailhandel/foutopsporing CreateDevice
D3DQUERYTYPE_OCCLUSION D3DISSUE_BEGIN,D3DISSUE_END DWORD Detailhandel/foutopsporing N.V.T

 

Veld Vlaggen voor IDirect3DQuery9::Probleem:

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

Veld Vlaggen voor IDirect3DQuery9::GetData:

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

Programmeertips