ポーリングとイベント通知
入力データが使用可能かどうかを知るには、2 つの方法があります。ポーリングとイベント通知です。
デバイスのポーリングとは、定期的にデバイス オブジェクトの現在のステートを取得したり、イベント バッファーの内容をチェックすることです。ポーリングは通常、アイドル状態になることがなく、常にゲームの世界を更新しレンダリングする、リアルタイム ゲームで使用されます。
ポーリング
C++ アプリケーションでは、通常、ポーリングはメッセージ ループ内で実行されます。
一部のジョイスティックやその他のゲーム デバイス、またはそれらのデバイスの特定のオブジェクトでは、ハードウェア割り込みが発生しないため、IDirectInputDevice8::ポーリング メソッドを呼び出すまでデータが返されず、イベントも通知されません(舞台裏で行われるこのポーリングと、説明したアプリケーション ポーリングを混同しないでください。IDirectInputDevice8::ポーリング はデータを取得するのではなく、データを使用可能にするだけです)。
データの取得が必要になるたびに IDirectInputDevice8::ポーリング を呼び出す必要があるかどうかを調べるには、まずデバイスのデータ フォーマットを設定し、次に IDirectInputDevice8::GetCapabilities メソッドを呼び出して、DIDEVCAPS 構造体の DIDC_POLLEDDATAFORMAT フラグをチェックします。
DIDC_POLLEDDATAFORMAT フラグと DIDC_POLLEDDEVICE フラグを混同しないでください。DIDC_POLLEDDEVICE は、ポーリングが必要なオブジェクトがデバイスに 1 つでも存在すれば、データ フォーマットに関係なく設定されます。その後、IDirectInputDevice8::GetObjectInfo メソッドを呼び出して、DIDEVICEOBJECTINSTANCE 構造体の DIDOI_POLLED フラグをチェックすることにより、ポーリングが必要な特定のオブジェクトであるかどうかを調べることができます。
DIDC_POLLEDDEVICE フラグは、デバイスの最悪の場合を示しているのであり、実際の状態を示しているのではありません。たとえば、解像度のソフトウェア制御が可能なヒューマン インターフェイス デバイス (HID) マウスは、解像度情報の読み取りにポーリングを必要とするため、DIDC_POLLEDDEVICE としてマークされます。標準ボタンと軸データのみを取得する場合、この条件であればデバイスへのポーリングは必要ありません。ただし、すべての任意の入力デバイスで IDirectInputDevice8::ポーリング メソッドを呼び出してもかまいません。呼び出しが不要な場合は、何の影響もなく、高速で終了します。
イベント通知
イベント通知は、入力を待ってから処理を行うアプリケーションに適しています。
イベント通知を使用するには、Microsoft Win32 の CreateEvent 関数を使用してスレッド同期オブジェクトを設定し、次に、このイベントのハンドルを IDirectInputDevice8::SetEventNotification メソッドに渡すことにより、イベントをデバイスに関連付けます。これで、その後、デバイスのステートに変化があった場合に、Microsoft DirectInput からイベントが通知されます。アプリケーションは、WaitForSingleObject などの Win32 関数を使用してイベントの通知を受け取り、その後、入力バッファーをチェックしてどのようなイベントであったかを調べることにより、イベントに応答できます。コード例については、「IDirectInputDevice8::SetEventNotification」を参照してください。