Поделиться через


Асинхронное уведомление (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 Розничная торговля/отладка Н/Д

 

Поле Flags для 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. 

Поле Flags для IDirect3DQuery9::GetData:

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

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