DirectInputはマイクロソフトによって開発されたソフトウェアコンポーネント「Microsoft DirectX」のうちのひとつであり、マウス、キーボード、ジョイスティック、ゲームコントローラ等を介してユーザーからの入力情報を収集するためのAPIである。DirectInputはまたゲーム中の入力機器のボタンや座標を特定のアクションに割り当てる「アクションマッピング」のシステムを提供する。さらに「フォースフィードバック」デバイスの入出力を扱う。

マイクロソフトはDirectX 9でXbox 360用コントローラーのためのXInputという新しい入力ライブラリを導入した。

DirectInputとXInputは通常のWin32アプリケーションにも利点がある。

DirectInputはDirectXライブラリの一部であるが、DirectX 8から大きな変更がない。2005年のMeltdownでのプレゼンテーション[リンク切れ]でマイクロソフトは、新しいアプリケーションはキーボードとマウスを制御するのにDirectInputではなくWindowsのメッセージループを活用して、Xbox 360のコントローラーでもDirectInputではなくXInputを使うように推奨した。

歴史

DirectInputはDirectXの一部であった。当初は実際はジョイスティックだけをサポートしており、マウスとキーボードの部分は標準Win32 APIの単なるラッパーであった。DirectXバージョン3.0よりキーボードとマウスがサポートされるようになり、ジョイスティックのサポートも改善した。DirectX 5.0ではジョイスティックのサポートを大幅に強化し、フォースフィードバックに対応し、ボタン数が増え、基盤となるデバイスドライバモデルが変更された。マウスでもボタン数が4から8に増えた。DirectX 7.0では長い間待望だった複数のマウスの接続が可能になり、ジョイスティックのように個別に操作できるようになったが、後にリリースされたWindows XPではこの機能が動作しなくなった(Windows 98/MEとDirectX 9の組み合わせでは引き続き動作していた)。DirectX 8.0はアクションマッピングや様々な異なる種類の装置を広くサポートする最後のメジャーバージョンアップとなった。

マイクロソフトは元々DirectInputを全ての入力機器を取り扱う方法として売り込んだが、のちにこの方針は撤回された。以後、マイクロソフトはDirectInputを使ってキーボードとマウスを制御することを推奨しておらず、Xbox 360コントローラーの利用にも新しいXInputを推奨している。というのも、Windows XPではRaw Input API[1]のサポートが追加され、WM_INPUT[2]というウィンドウメッセージが追加されたが、DirectInputはWM_INPUTのデータを読み取る2つ目のスレッドを内部的に作成するため、DirectInput APIを使用することによって、単にWM_INPUTを直接読み取る場合よりもオーバーヘッドが増加してしまうからである[3][4]。マウスまたはキーボードのデバイスからデータを読み取る場合は、DirectInputを使用する利点はない。高解像度マウスの移動データが必要ない場合はWM_MOUSEMOVEを、高精度の制御が必要なFPSゲームでのエイミング操作のようにパフォーマンス最適化の観点から高解像度マウスのサポートが求められる場合はWM_INPUTを用いることが推奨されている。

XInput

XInputは「次世代」コントローラーのためのAPIであり、Xbox 360の発売と共に導入され、Xbox 360コントローラーの全ての機能がWindows XP SP1以上で利用できるようになった。XInputはDirectInputよりもプログラムが劇的に簡単になる利点がある。XInputはDirectX 9以上から利用できる。

DirectInputとXInputの比較

DirectInputはDirectX 8から大きな変更が無く、XInputは後のDirectX 9で導入され、2つのAPIの現状と将来には若干の混乱がある。現在はお互いにない特徴があり、そしていずれもDirectX 10で大きな変更はない。

Xbox 360用コントローラーとマイクロソフトのデフォルトのWindowsドライバの組み合わせにおいてDirectInputを使う場合、XInputと比較して以下の制約がある。

MSDNによると、以下のような説明および解決策が記載されている[5][6]。

DirectInput の左右のトリガーの組み合わせは、意図的なもの[7]です。ゲームでは、DirectInput デバイスとユーザーとの対話操作がない場合、このデバイスの軸は常に中央に配置されると想定しています。ただし、トリガーが保持されない場合、Xbox 360 コントローラーは中心ではなく最小値を登録するように設計されていました。したがって、以前のゲームはユーザーの対話操作を想定しています。 この解決策とは、トリガーを組み合わせて、あるトリガーを正の方向に設定し、もう 1 つのトリガーを負の方向に設定するというものでした。それによって、DirectInput に"制御"が中央にあることをユーザーの対話操作で示すことがなくなります。

これはしかしながら、デュアルアナログスティックのあるゲームパッドやハンドルコントローラーなどのような様々なDirectInputコントローラーが既にトリガーやペダルに個々に割り当て済みであるという事実を無視していた。しかも多くのDirectInputデバイスには振動機能も搭載されていた。Xbox 360用コントローラーで振動機能をサポートし、デッドゾーンの検知や、(オプションとして)独立したトリガーをDirectInput経由で利用できる、XBCDというドライバが存在している。これはDirectInputとXInputのAPIの違いによるものというよりはむしろ、マイクロソフトが提供するXbox 360用コントローラーのドライバは「意図的に」DirectInputでの機能を制限していることを示している。

現在XInputのAPIはDirectInputにはない制約もある。

DirectInputは従来から存在する規格のため、対応するドライバーが用意されているデバイスも豊富だが、XInputは後発のため、主要な対応デバイスとしてはXbox 360用の純正コントローラーおよびXbox One用の純正コントローラー[8]のみである。ただし、サードパーティー製の各種コントローラーもDirectInput/XInput両対応の製品がいくつか発売されている[9] [10]。

Windows 8で導入されたWindowsストアアプリでは、XInput 1.4のみが使用可能であり、デスクトップアプリ向けのXInput (1.1/1.2/1.3, 9.1.0) およびDirectInputは使用できない[11]。XInput 1.4ではオーディオヘッドセットの問い合わせ機能が追加されている[12]。

継続使用の試み

2022年現在、DirectInputは過去の技術とみなされているが、コミュニティベースでの試みとして、フライトシミュレーターをForce feedback API対応ジョイスティックで使用可能にする、XPForce プロジェクトが存在する[13]。

脚注

[脚注の使い方]
  1. ↑ Raw Input Overview - Win32 apps | Microsoft Learn
  2. ↑ WM_INPUT message (Winuser.h) - Win32 apps | Microsoft Learn
  3. ↑ Taking Advantage of High-Definition Mouse Movement - Win32 apps | Microsoft Learn
  4. ↑ 高解像度マウス動作の使用 | Microsoft Learn
  5. ↑ XInput と DirectInput | Microsoft Docs
  6. ↑ XInput and DirectInput - Win32 apps | Microsoft Docs
  7. ↑ 英語版の原文では「by design」(仕様)となっている。
  8. ↑ XINPUT and Windows 8 | Games for Windows and the DirectX SDK blog
  9. ↑ 幅広いゲームが楽しめる、USBゲームパッド - JC-U3613Mシリーズ
  10. ↑ F310 Gamepad - Logicool
  11. ↑ XInput Versions - Win32 apps | Microsoft Docs
  12. ↑ XInputGetAudioDeviceIds function (xinput.h) - Win32 apps | Microsoft Docs
  13. ↑ XPForce force-feedback will be coming to FS2020!

関連項目

Microsoft DirectX

⌬ Phoenix Mesh CID: 未登録 IPFS未登録 📡 0ピア N=1 CRITICAL PQS C51