なるほどえたきちのブログじゃねーの

なるほどえたきちのブログじゃねーの

なるほどえたきちのブログじゃねーよ

【XInput|DirectInput】PC用コントローラーで使われている通信プロトコルの違いをまとめたい

概要

PC用コントローラーには様々な通信プロトコルがあることをご存じでしょうか?
DirectInputとかXInputとかいうやつです。

最近のつよいコントローラーはこの通信プロトコルを切り替えられるものが多いですが、そもそも通信プロトコル切り替えて何が変わるの?という人は多々いるかと思います。
仮に同じコントローラーであったとしても、どの通信プロトコルを使っているかによってデバイスの仕様が若干変わる場合があります。
とっくに枯れた情報だと思ってるんですが、枯れすぎて最早忘れ去られていそうなのでメモとして残しておきます。

私の他の記事を見ていただけると分かると思うのですが、私自身自作のコントローラー基板やファームウェアの開発を行っていて、殆どのプロトコルは一通り自分でエミュレートまでさせる所まで試しています。
一般的に流布されている情報と違う内容も一部含まれると思いますが、大枠信じていただけると嬉しいです。

まず、今の市場に存在するコントローラーでよく使われる(?)プロトコルと仕様についてざっくりリストアップします。
それぞれの詳細については後段で説明します。
結論だけ先に言うとサードパーティ製ならXInput使っときゃいいです。(ジャイロが欲しい場合は別)
ポーリングレートとはあんまり関係ないのでその辺りは考えないでください。

名称 分解能 振動 ジャイロ ボタン数 備考
DirectInput 8bit 1 × 128+8(アナログ) -
XInput 16bit × 15+2(アナログ)2 -
Switch Pro 12bit 18 CS機用
SIXAXIS 8bit × 17+12(アナログ) CS機用
DualShock 3 8bit 17+12(アナログ) CS機用
DualShock 4 8bit 18+2(アナログ) CS機用
DualSense 8bit 19+2(アナログ) CS機用

各項目の詳細について

分解能

スティックの値をどれくらいの粒度で示すかを指す指標です。
8bitであれば値の幅は0~255、12bitであれば0~4095、16bitであれば0~65535です。
この値が大きければ大きいほど理論上は微細な動きを感知しやすくなります。
ただ、8bitでも大抵は手ブレの方が大きいので、実プレイで困るようなことはないと思います。

振動

プロトコル上振動をサポートしているかどうかです。
ただしゲームによって対応状況は異なります。
特にDualSense、Switch Proは他のコントローラーとは異なり、ハプティックフィードバックを採用しています。
この都合上、これに上手く対応できていないゲームも場合によってはありそうです。
余程古いゲームでない限り、XInputなら安定して動作すると思います。

ジャイロ

モーションセンサーを使用できるかどうかです。
コントローラー側でジャイロ対応を謳っていても、モードなどによって使えない場合があるのはこれが原因です。
PC用の汎用プロトコルではこの機能をそのまま使用することはできません。
スティックの操作に変換するような機能を持ったコントローラーもありますが、CS機と同じ感覚で使いたい場合は「Switchモード」「DSEモード」のような機能を探してみましょう。

ボタン数

プロトコル上扱えるボタンの最大数です。
DirectInputはボタン数が可変でマッピングが規格上定義されていないので、予めPC側でマッピングの設定を行う必要があったりなかったりします。
この煩雑さを解消するために生み出されたのがXInputだったりします。

プロトコル自体の詳細について

DirectInput

古の時代から存在するUSBゲームパッドプロトコルです。
汎用規格として策定されたため、これをメーカーが使うにあたってのルールのようなものも特に存在しません。
特に、「このボタンはこの位置に配置する」のようなルールすらないため、パッドによってボタンの位置がバラバラです。
パッドAでマッピング設定を行った後にパッドBを繋げた時に、Lボタンを押したらXボタンが反応する、みたいな現象がよく起こります。
あと、スティック値の入力も8つあるアナログ軸の内4つを使用して取得します。

Switchの公式ライセンスコントローラーなどはこれを使っています。
マッピングのルールは任天堂側がしっかり決めているようで、ボタンの位置がぐちゃぐちゃになるといった問題はSwitchで使う分には起こりません。

XInput

DirectInputの後継のような感じでMicrosoftが定義したプロトコルです。
Xbox360のコントローラーはこれが使用されています。
この時代はファーストパーティのUSBゲームパッドが存在しなかったためか、「ボタンの位置が決め打ちされていてマッピング設定の必要がない」という点で画期的でした。
拡張性を完全に捨てているためDirectInputの完全上位互換ではなく、ボタン数は現行のファーストパーティ製コントローラーと比べると絶妙に1つ足りないです。
Windows OS側でDirectInputに変換するための互換レイヤーが存在するため、古のゲームでも基本は使えるはずです。

スティックの解像度は今でもこのプロトコルが一番高いです。(ややオーバースペックだと思いますが)
ネイティブのジャイロ機能を使わないのであれば取り敢えずこれを使っておけばいいです。
中華コンの設定に分解能(ステップ精度)の項目があるものが増えてきましたが、これを気にするのであればXInputでないと殆ど意味がないので注意してください。

SIXAXIS/DualShock/DualSense

アナログ入力が存在するボタンであってもプロトコル上はデジタル入力の情報を持っています。
あと、SIXAXISは何故かデジタル入力しか存在しないボタンのアナログ値も取ってきているようです。
その辺りのよく分からない差異はありつつも、PCで扱う分にはSIXAXISもDualSense Edgeもできること自体は大体同じです。
一通りの機能が揃っているので無難に遊びやすいかも?と思います。
サードパーティ製でこれを入れているのはBIGBIG WONのBlitz2辺りですね。
XInputと比べてスティックの精度が若干落ちますが、あれは多分ジャイロ使いたい人向けだと思います。

Switch Pro

なんかDirectInputと紹介されていることが多いですが全くの別物です。
謎に分解能が高いです。
殆どのコントローラーが内部的に使っているADC(スティックの値を実際に読み取る部品)は10bit~12bitくらいであることが多いので、それに合わせて理論値だけ出せるようにしておいた感じでしょうか。
ジャイロも振動もありますし、動きさえすればプロトコル上は意外と優れていたりします。
サードパーティ製だとSwitch対応用にこのプロトコルを入れているケースを目にしますね。

任天堂はこのプロトコルをPCで使うことをあんまり想定していない気はします。
故にDualShockやDualSenseと比べて細かい挙動で不安定な所はあります。

さいごに

XInputは新しいプロトコル!みたいなこと言われてるのをたまに見掛けるけどこれ策定されたの20年前なのウケる


  1. あるにはあるが、最近のソフトだと動かない可能性高め
  2. ホームボタンの仕様が他と異なるため、自由に使えるのは実質16ボタン