共用方式為


非同步通知 (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.

程式設計提示