非同期通知 (Direct3D 9)
パフォーマンス コストがない場合にアプリケーションで実行できる、ドライバーに関する興味深いクエリが多数あります。 Direct3D 7 と Direct3D 8 では、同期クエリ メカニズムである GetInfo が統計などに適していましたが、パフォーマンスに重要なクエリは追加されませんでした。 本質的に非同期である他のもの (フェンスなど) があります。 これは、同期クエリと非同期クエリの両方を作成するための単純な API です。 Direct3D 9 では GetInfo は廃止されます。
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 | Retail/Debug | CreateDevice |
D3DQUERYTYPE_ResourceManager | D3DISSUE_END | D3DDEVINFO_ResourceManager | デバッグのみ | プレゼント |
D3DQUERYTYPE_VERTEXSTATS | D3DISSUE_END | D3DDEVINFO_D3DVERTEXSTATS | デバッグのみ | プレゼント |
D3DQUERYTYPE_EVENT | D3DISSUE_END | BOOL | Retail/Debug | CreateDevice |
D3DQUERYTYPE_OCCLUSION | D3DISSUE_BEGIN,D3DISSUE_END | DWORD | Retail/Debug | 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の Flags フィールド:
#define D3DGETDATA_FLUSH (1 << 0) // Tells the runtime to flush
// if the query is outstanding.
関連トピック