Асинхронное уведомление (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.
Связанные темы