Асинхронное уведомление (Direct3D 9)

Существует несколько интересных запросов на драйвере, которые приложение может сделать, если нет затрат на производительность. В Direct3D 7 и Direct3D 8 синхронный механизм запроса GetInfo хорошо работал для таких вещей, как статистика, но не были добавлены критически важные для производительности запросы. Существуют и другие вещи (например, заборы), которые по сути асинхронны. Это простой API для синхронных и асинхронных запросов. GetInfo будет прекращен в Direct3D 9.

Создайте запрос с помощью IDirect3DDevice9::CreateQuery. Этот метод принимает D3DQUERYTYPE, который определяет тип запроса и возвращает указатель на объект IDirect3DQuery9. Если тип запроса не поддерживается, вызов возвращает ошибку D3DERR_NOTAVAILABLE. С помощью объекта запроса приложение отправляет запрос в среду выполнения с помощью IDirect3DQuery9::Issueи опрашивает состояние запроса с помощью IDirect3DQuery9::GetData. Если результат запроса доступен, возвращается S_OK; в противном случае возвращается S_FALSE. Ожидается, что приложение передает соответствующий буфер размера для результатов запроса.

Приложение может принудительно удалить запрос до драйвера, используя D3DGETDATA_FLUSH с IDirect3DQuery9::GetData. Это приводит к очистке, заставляя драйвер видеть запрос. В этом случае D3DERR_DEVICELOST возвращается, если устройство теряется.

Все запросы теряются при потере устройства, приложение должен повторно создать их. Если устройство не поддерживает запрос и pQueryID NULL, создание запроса завершится ошибкой D3DERR_INVALIDCALL.

В следующей таблице приведены важные сведения о каждом типе запроса.

QuertyType Допустимый флаг проблемы Буфер GetData Среды выполнения Неявное начало запроса
D3DQUERYTYPE_VCACHE D3DISSUE_END D3DDEVINFO_VCACHE Розничная торговля и отладка CreateDevice
D3DQUERYTYPE_ResourceManager D3DISSUE_END D3DDEVINFO_ResourceManager Отладка только Присутствующий
D3DQUERYTYPE_VERTEXSTATS D3DISSUE_END D3DDEVINFO_D3DVERTEXSTATS Отладка только Присутствующий
D3DQUERYTYPE_EVENT D3DISSUE_END BOOL Розничная торговля и отладка CreateDevice
D3DQUERYTYPE_OCCLUSION D3DISSUE_BEGIN,D3DISSUE_END DWORD Розничная торговля и отладка N/A

 

Поле флагов для 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. 

Поле флагов для IDirect3DQuery9::GetData:

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

советы по программированию