次の方法で共有


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

プログラミングのヒント