次の方法で共有


非同期通知

非同期通知

パフォーマンスに影響しなければアプリケーションがドライバに対して行える興味深い問い合わせが多数ある。Microsoft® DirectX® 7.0 および DirectX 8.x には、GetInfo という同期的問い合わせメカニズムがあった。このメカニズムは統計情報などの問い合わせに有効だったが、パフォーマンスに大きな影響を及ぼす問い合わせは含まれなかった。これに対し、フェンスなどは本質的に非同期的である。これは単純なアプリケーション プログラミング インターフェイス (API) で、同期と非同期の両方の問い合わせを行うことができる。DirectX 9.0 では GetInfo は使えない。

問い合わせを作成するには、IDirect3DDevice9::CreateQuery を使う。このメソッドは、実行する問い合わせの種類を定義する D3DQUERYTYPE を受け取り、IDirect3DQuery9 オブジェクトへのポインタを返す。問い合わせのタイプがサポートされていない場合、呼び出しはエラー D3DERR_NOTAVAILABLE を返す。このオブジェクトを使うと、アプリケーションは IDirect3DQuery9::Issue でランタイムに対して問い合わせを実行でき、IDirect3DQuery9::GetData で問い合わせのステータスをポーリングできる。問い合わせの結果が利用可能な場合は S_OK が返される。それ以外の場合は S_FALSE が返される。アプリケーションは、問い合わせの結果に適したサイズのバッファを渡す必要がある。

アプリケーションは、D3DGETDATA_FLUSH を IDirect3DQuery9::GetData と共に使って、ランタイムからドライバに強制的に問い合わせをフラッシュできる。これにより、フラッシュが実行され、ドライバに強制的に問い合わせが伝えられる。このとき、デバイスが失われた場合は、D3DERR_DEVICELOST が返される。

デバイスが失われるとすべての問い合わせが失われ、アプリケーションで問い合わせを作成し直す必要がある。デバイスが問い合わせをサポートしていない場合で、pQueryID が NULL の場合、問い合わせの作成が失敗して D3DERR_INVALIDCALL が返される。

次の表は、各問い合わせタイプに関する重要な情報をまとめたものである。

QuertyType 有効な発行フラグ GetData バッファ ランタイム 非明示的な問い合わせの開始
D3DQUERYTYPE_VCACHE D3DISSUE_END D3DDEVINFO_VCACHE リテール/デバッグ CreateDevice
D3DQUERYTYPE_RESOURCEMANAGER D3DISSUE_END D3DDEVINFO_RESOURCEMANAGER デバッグのみ Present
D3DQUERYTYPE_VERTEXSTATS D3DISSUE_END D3DDEVINFO_D3DVERTEXSTATS デバッグのみ Present
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 
// beginng of a query. 

IDirect3DQuery9::GetData のフラグ フィールド

 
#define D3DGETDATA_FLUSH (1 << 0) // Tells the runtime to flush 
// if the query is outstanding.