次の方法で共有


バッファリング データと直接データ

バッファリング データと直接データ

Microsoft® DirectInput® は、バッファリング データと直接データの 2 種類のデータを提供する。バッファリング データは、アプリケーションが取得するまで格納されているイベントのレコードである。直接データは、デバイスの現在の状態のスナップショットである。

直接データは、デバイスの現在の状態だけを必要とするアプリケーションで使うことが考えられる。たとえば、ジョイスティックの現在位置と、1 つあるいは複数のボタンの状態に反応するフライト コンバット シミュレーションなどである。バッファリング データは、状態よりもイベントを重要視する場合に選択するとよい。たとえば、マウスの動きやボタンのクリックに反応するアプリケーションなどである。両方の種類のデータを使うこともできる。たとえば、ジョイスティック軸では直接データを取得して、ボタンではバッファリング データを取得する場合などである。

  アクション マップを使う場合、バッッファリング データ パケットには入力に関するアプリケーション定義データが含まれるため、バッファリング データを取得する必要がある。バッファリング データ パケットでは状態ではなくイベントが報告されるため、このデータを取得するには絶対軸の位置を追跡しなければならない。

アプリケーションは、IDirectInputDevice8::GetDeviceState メソッドを呼び出して直接データを取得する。名前が表すとおり、このメソッドはデバイスの現在の状態を返す。たとえば、各ボタンがアップ状態かダウン状態かなどである。このメソッドは、現在の状態と以前の状態を比較して得られる暗黙の情報を除いて、最後の呼び出し以降にデバイスで発生したイベントに関するデータは、まったく提供しない。たとえば、前回の IDirectInputDevice8::GetDeviceState の呼び出し以降にユーザーがボタンを押して離した場合、今回の IDirectInputDevice8::GetDeviceState の呼び出しではそれらの入力情報はアプリケーションには伝えられない。一方、ボタンを押したままにしていると、IDirectInputDevice8::GetDeviceState は、ユーザーがボタンを離すまで「ボタン ダウン」を報告し続ける。

このデバイス状態の報告は、WM_LBUTTONDOWN のような 1 回限りのメッセージによる Microsoft Windows® のイベント報告とは異なり、Microsoft Win32® の GetKeyboardState 関数の報告に類似している。IDirectInputDevice8::GetDeviceState を使ってデバイスをポーリングする場合は、ボタン クリック、ダブルクリック、または単一のキー ストロークの区別をプログラムで判断しなければならず、また、アプリケーションがボタン ダウン状態またはキー ダウン状態に対し、不適切なタイミングで応答し続けることのないように適切に処理しなければならない。

バッファリング データの場合、イベントは、プログラムが処理を開始できる状態になるまで格納されている。ボタンやキーが押されたり、軸が移動されたりするたびに、そのイベントに対する情報がバッファ中の DIDEVICEOBJECTDATA 構造体に格納される。バッファがオーバーフローすると、新しいデータは失われる。アプリケーションがバッファを読み取るときは、IDirectInputDevice8::GetDeviceData を呼び出す。一度に任意の数の項目を読み取ることができる。

項目を読み取ると、通常は、バッファからその項目が消去されるが、消去なしの調査も選択できる。

バッファリング データを取得するには、まず IDirectInputDevice8::SetProperty メソッドまたは IDirectInputDevice8::SetActionMap メソッドでバッファ サイズを設定する必要がある (「デバイス プロパティ」の例を参照すること)。バッファ サイズの設定は、デバイスを最初に取得する前に行う。効率上の理由から、デフォルトのバッファ サイズはゼロである。この値を変更しない限り、バッファリング データを取得することはできない。バッファ サイズはバイト単位ではなく、デバイスのタイプに対応したデータの項目単位でカウントされる。

IDirectInputDevice8::GetDeviceData メソッドを呼び出した後で、pdwInOut パラメータ値をチェックする必要がある。バッファから取得される項目数は、この変数に返される。

  アナログ ジョイスティックなど、割り込みを生成しないデバイスの場合、IDirectInputDevice8::Poll メソッドを呼び出すまで、DirectInput はデータを取得しない。詳細については、「ポーリングとイベント通知」を参照すること。

バッファリング データを取得する例については、「IDirectInputDevice8::GetDeviceData」を参照すること。

参照