Condividi tramite


Notifica asincrona (Direct3D 9)

Esistono numerose query interessanti su un driver che un'applicazione può effettuare se non esiste alcun costo di prestazioni. In Direct3D 7 e Direct3D 8, un meccanismo di query sincrono, GetInfo ha funzionato bene per gli elementi come le statistiche, ma non sono state aggiunte query critiche per le prestazioni. Ci sono altre cose (come le recinzioni) che sono intrinsecamente asincrone. Si tratta di un'API semplice per eseguire query sincrone e asincrone. GetInfo verrà ritirato in Direct3D 9.

Creare una query usando IDirect3DDevice9::CreateQuery. Questo metodo accetta un oggetto D3DQUERYTYPE, che definisce il tipo di query da creare e restituisce un puntatore a un oggetto IDirect3DQuery9 . Se il tipo di query non è supportato, la chiamata restituisce un errore D3DERR_NOTAVAILABLE. Usando l'oggetto query, l'applicazione invia la query al runtime usando IDirect3DQuery9::Issue e esegue il polling dello stato della query usando IDirect3DQuery9::GetData. Se il risultato della query è disponibile, viene restituito S_OK; in caso contrario, viene restituito S_FALSE. L'applicazione deve passare un buffer di dimensioni appropriate per i risultati della query.

L'applicazione ha un'opzione per forzare il runtime a scaricare la query fino al driver usando D3DGETDATA_FLUSH con IDirect3DQuery9::GetData. Causa uno scarico, forzando il driver a visualizzare la query. In questo caso, D3DERR_DEVICELOST viene restituito se il dispositivo viene perso.

Tutte le query vengono perse quando il dispositivo viene perso, l'applicazione deve ricrearle. Se il dispositivo non supporta la query e pQueryID è NULL, la creazione della query avrà esito negativo con D3DERR_INVALIDCALL.

La tabella seguente riepiloga informazioni importanti su ogni tipo di query.

QuertyType Flag di problema valido Buffer GetData Runtime Inizio implicito della query
D3DQUERYTYPE_VCACHE D3DISSUE_END D3DDEVINFO_VCACHE Retail/Debug CreateDevice
D3DQUERYTYPE_ResourceManager D3DISSUE_END D3DDEVINFO_ResourceManager Solo debug Presente
D3DQUERYTYPE_VERTEXSTATS D3DISSUE_END D3DDEVINFO_D3DVERTEXSTATS Solo debug Presente
D3DQUERYTYPE_EVENT D3DISSUE_END BOOL Retail/Debug CreateDevice
D3DQUERYTYPE_OCCLUSION D3DISSUE_BEGIN,D3DISSUE_END DWORD Retail/Debug N/D

 

Contrassegna il campo per 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. 

Contrassegna il campo per IDirect3DQuery9::GetData:

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

Suggerimenti per la programmazione