Compartir a través de


Notificación asincrónica (Direct3D 9)

Hay varias consultas interesantes en un controlador que una aplicación puede realizar si no hay ningún costo de rendimiento. En Direct3D 7 y Direct3D 8, un mecanismo de consulta sincrónico, GetInfo, funcionó bien para cosas como estadísticas, pero no se agregaron consultas críticas para el rendimiento. Hay otras cosas (como las vallas) que son intrínsecamente asincrónicas. Se trata de una API sencilla para realizar consultas sincrónicas y asincrónicas. GetInfo se retirará en Direct3D 9.

Cree una consulta mediante IDirect3DDevice9::CreateQuery. Este método toma un D3DQUERYTYPE, que define qué tipo de consulta realizar y devuelve un puntero a un objeto IDirect3DQuery9 . Si no se admite el tipo de consulta, la llamada devuelve un error D3DERR_NOTAVAILABLE. Con el objeto de consulta, la aplicación envía la consulta al entorno de ejecución mediante IDirect3DQuery9::Issue y sondea el estado de la consulta mediante IDirect3DQuery9::GetData. Si el resultado de la consulta está disponible, se devuelve S_OK; de lo contrario, se devuelve S_FALSE. Se espera que la aplicación pase un búfer de tamaño adecuado para los resultados de la consulta.

La aplicación tiene una opción para forzar al tiempo de ejecución a vaciar la consulta hasta el controlador mediante D3DGETDATA_FLUSH con IDirect3DQuery9::GetData. Provoca un vaciado, lo que obliga al controlador a ver la consulta. En este caso, se devuelve D3DERR_DEVICELOST si el dispositivo se pierde.

Todas las consultas se pierden cuando se pierde el dispositivo, la aplicación tiene que volver a crearlas. Si el dispositivo no admite la consulta y pQueryID es NULL, se producirá un error en la creación de la consulta con D3DERR_INVALIDCALL.

En la tabla siguiente se resume información importante sobre cada tipo de consulta.

QuertyType Marca de problema válida Búfer GetData Tiempo de ejecución Inicio implícito de la consulta
D3DQUERYTYPE_VCACHE D3DISSUE_END D3DDEVINFO_VCACHE Retail/Debug CreateDevice
D3DQUERYTYPE_ResourceManager D3DISSUE_END D3DDEVINFO_ResourceManager Depurar solo Presente
D3DQUERYTYPE_VERTEXSTATS D3DISSUE_END D3DDEVINFO_D3DVERTEXSTATS Depurar solo Presente
D3DQUERYTYPE_EVENT D3DISSUE_END BOOL Retail/Debug CreateDevice
D3DQUERYTYPE_OCCLUSION D3DISSUE_BEGIN,D3DISSUE_END DWORD Retail/Debug N/D

 

Campo Marcas para 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. 

Campo Marcas para IDirect3DQuery9::GetData:

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

Sugerencias de programación