Partilhar via


Notificação assíncrona (Direct3D 9)

Há um número de consultas interessantes sobre um driver que um aplicativo pode fazer se não houver custo de desempenho. No Direct3D 7 e no Direct3D 8, um mecanismo de consulta síncrono, GetInfo, funcionou bem para coisas como estatísticas, mas nenhuma consulta crítica de desempenho foi adicionada. Há outras coisas (como cercas) que são inerentemente assíncronas. Esta é uma API simples para fazer consultas síncronas e assíncronas. GetInfo será desativado no Direct3D 9.

Crie uma consulta usando IDirect3DDevice9::CreateQuery. Esse método usa um D3DQUERYTYPE, que define que tipo de consulta fazer e retorna um ponteiro para um IDirect3DQuery9 objeto. Se o tipo de consulta não for suportado, a chamada retornará um erro D3DERR_NOTAVAILABLE. Usando o objeto de consulta, o aplicativo envia a consulta para o tempo de execução usando IDirect3DQuery9::Issuee sonda o status da consulta usando IDirect3DQuery9::GetData. Se o resultado da consulta estiver disponível, S_OK será retornado; caso contrário, S_FALSE será retornado. Espera-se que o aplicativo passe um buffer de tamanho apropriado para os resultados da consulta.

O aplicativo tem uma opção para forçar o tempo de execução para liberar a consulta para o driver usando D3DGETDATA_FLUSH com IDirect3DQuery9::GetData. Ele causa uma descarga, forçando o motorista a ver a consulta. Nesse caso, D3DERR_DEVICELOST é retornado se o dispositivo se perder.

Todas as consultas são perdidas quando o dispositivo é perdido, o aplicativo tem que recriá-los. Se o dispositivo não suportar a consulta e o pQueryID estiver NULL, a criação da consulta falhará com D3DERR_INVALIDCALL.

A tabela a seguir resume informações importantes sobre cada tipo de consulta.

QuertyType Sinalizador de emissão válido Buffer GetData Tempo de execução Início implícito da consulta
D3DQUERYTYPE_VCACHE D3DISSUE_END D3DDEVINFO_VCACHE Varejo/Depuração CreateDevice
D3DQUERYTYPE_ResourceManager D3DISSUE_END D3DDEVINFO_ResourceManager Apenas depuração Atualidade
D3DQUERYTYPE_VERTEXSTATS D3DISSUE_END D3DDEVINFO_D3DVERTEXSTATS Apenas depuração Atualidade
D3DQUERYTYPE_EVENT D3DISSUE_END BOOL Varejo/Depuração CreateDevice
D3DQUERYTYPE_OCCLUSION D3DISSUE_BEGIN.D3DISSUE_END DWORD Varejo/Depuração N/A

 

Campo Sinalizadores para IDirect3DQuery9::Problema:

#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 Sinalizadores para IDirect3DQuery9::GetData:

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

Dicas de Programação