如果沒有任何效能成本,應用程式可以在驅動程式上進行一些有趣的查詢。 在 Direct3D 7 和 Direct3D 8 中,同步查詢機制 GetInfo 適用於統計數據之類的專案,但未新增任何效能關鍵查詢。 還有其他東西(如柵欄),本質上是異步的。 這是一個簡單的 API,可進行同步和異步查詢。 GetInfo 將在 Direct3D 9 中淘汰。
使用 IDirect3DDevice9::CreateQuery建立查詢。 此方法會採用 D3DQUERYTYPE,定義要建立的查詢類型,並傳回 IDirect3DQuery9 物件的指標。 如果不支援查詢類型,呼叫會傳回錯誤D3DERR_NOTAVAILABLE。 使用查詢物件,應用程式會使用 IDirect3DQuery9::Issue提交查詢至運行時間,並使用 IDirect3DQuery9::GetData輪詢查詢狀態。 如果查詢結果可用,則會傳回S_OK;否則會傳回S_FALSE。 應用程式預期會針對查詢結果傳遞適當大小的緩衝區。
應用程式可以選擇強制運行時間將查詢排清至驅動程式,方法是搭配 IDirect3DQuery9::GetData使用 D3DGETDATA_FLUSH 。 這會導致排清,迫使驅動程式查看查詢。 在此情況下,如果裝置遺失,則會傳回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.
相關主題