ポーリングとイベント通知
ポーリングとイベント通知
入力データが発生しているかどうかを確認するためには、ポーリングとイベント通知という 2 つの方法がある。
デバイスのポーリングとは、デバイス オブジェクトの現在の状態を定期的に取得すること、またはイベント バッファの内容を調べることを意味する。ポーリングが使われるのは、通常、決してアイドル状態になることがなく、常にゲームの世界を更新およびレンダリングするリアルタイム ゲームである。
ポーリング
C++ アプリケーションでのポーリングは、通常、メッセージ ループ内で行われる。
ジョイスティックや他のゲームデバイス、またはこれらのデバイス上のオブジェクトのうちいくつかは、IDirectInputDevice8::Poll メソッドを呼び出すまでハードウェア割り込みを生成せず、データも返さず、イベントも送信しない。このようなバックグラウンドでのポーリングを、ここで説明するアプリケーション ポーリングと混同しないこと。IDirectInputDevice8::Poll メソッドはデータを取得しないが、データを単に使用可能にするだけである。
データを取得しようとするたびに IDirectInputDevice8::Poll メソッドを呼び出す必要があるかどうかを調べるには、まずデバイスのデータ形式を設定し、次に IDirectInputDevice8::GetCapabilities メソッドを呼び出して、DIDEVCAPS 構造体の DIDC_POLLEDDATAFORMAT フラグをチェックする。
DIDC_POLLEDDATAFORMAT フラグと DIDC_POLLEDDEVICE フラグを混同しないこと。後者は、データ形式に関係なく、デバイス上のオブジェクトのいずれかがポーリングを必要としているときに設定する。次に、IDirectInputDevice8::GetObjectInfo メソッドを呼び出し、DIDEVICEOBJECTINSTANCE 構造体にある DIDOI_POLLED フラグをチェックすると、ポーリングを必要としているのが特定のオブジェクトであるかどうかを見分けられる。
DIDC_POLLEDDEVICE フラグはデバイスの最悪の状態を表すのであって、デバイスの実際の状態を表すわけではない。たとえば、ソフトウェア解像度調節付きの HID (Human Interface Device) マウスでは、細分度情報を読み取るためにポーリングを要求するので、DIDC_POLLEDDEVICE フラグが設定される。デバイスの標準ボタンと軸データだけを取得したい場合は、このような条件でデバイスをポーリングする必要はない。ただし、任意の入力デバイスに対して IDirectInputDevice8::Poll メソッドを読み出してもかまわない。この呼び出しが不要なときは、何のエフェクトも持たずにすぐに終了する。
イベント通知
イベント通知は、Scrawl サンプルのように、何もしないで入力を待つようなアプリケーションに適している。
イベント通知を使うには、Microsoft® Win32® CreateEvent 関数でスレッド同期オブジェクトを設定した後、イベントのハンドルを IDirectInputDevice8::SetEventNotification メソッドに渡すことによって、このイベントとデバイスを関係付ける。これで、デバイスの状態が変化するたびに、Microsoft DirectInput® がイベントを通知する。アプリケーションは、WaitForSingleObject などの Win32 関数を使って、イベントの通知を受け取った後、入力バッファをチェックして何のイベントかを確認し、応答できる。サンプル コードについては、「Scrawl サンプル」および「IDirectInputDevice8::SetEventNotification」を参照すること。