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.
Verwante onderwerpen