非同期通知 (Direct3D 9)
ドライバーには、パフォーマンス コストがない場合にアプリケーションで実行できる興味深いクエリが多数あります。 Direct3D 7 と Direct3D 8 では、同期クエリ メカニズム GetInfo が統計などに適していましたが、パフォーマンスに重要なクエリは追加されませんでした。 本質的に非同期である他のもの (フェンスなど) があります。 これは、同期クエリと非同期クエリの両方を作成するための単純な API です。 GetInfo は Direct3D 9 で廃止されます。
IDirect3DDevice9::CreateQuery を使用してクエリを作成します。 このメソッドは、作成するクエリの種類を定義し、 IDirect3DQuery9 オブジェクトへのポインターを返す D3DQUERYTYPE を受け取ります。 クエリの種類がサポートされていない場合、呼び出しはエラー 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 | 該当なし |
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.
関連トピック