非同步通知 (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.
相關主題