共用方式為


異步通知 (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。 應用程式預期會針對查詢結果傳遞適當大小的緩衝區。

應用程式可以選擇強制運行時間將查詢排清至驅動程式,方法是搭配 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.

程式設計秘訣