読者です 読者をやめる 読者になる 読者になる

Ichigo Exception <3

スマブラDXと、Linuxカーネルと、日々のつらい気持ち

GCコントローラ入力のサンプリングレート

コントローラ入力をモニタリングできたらいいなぁと思って、信号を覗いてみたことがあります(この話に関しては、また別の記事で)。
予想ではコントローラは60sps(samples per second)で入力状態を取ってると思っていましたが、実際には120spsでした。これに関するまとめです。

サンプリングレート

GCはコントローラに対して24bitのリクエスト信号を送り、コントローラはGCに対し64bitの応答を返す。 これを秒間120回行うというのが、コントローラ接続後の通常動作です。 すなわち、GCのハードウェア仕様としては、映像の60fpsに対し、コントローラの入力サンプリングレートは120spsです。 ここまで聞くと、まるで秒間60連打ができそうに思えますね(連打は010101…を認識しないといけないので、秒間最高連打数はサンプリングレートの半分になる)。

スマブラDXでの扱い

残念ながら、スマブラDXで秒間60連打はできないようです。 ふつうに考えると、120spsでサンプルしているなら最短1/120sだけボタンをONすれば必ず認識されるはずです。 しかし、120spsのうち、偶数回目のサンプルで「1」を検知したときのみ認識され、奇数回目のサンプルで「1」を検知してもゲームでは認識されないことがコントローラ信号をキャプチャしてわかりました。 実験は、スタートボタンを一瞬(1/120s)だけ入力して、それが効くかどうか確認しました。結果は以下のように…

偶数サンプル 0058  Start: 0  
奇数サンプル 0059 Start: 1 // これは効かない  
偶数サンプル 0000 Start: 0  
:  
奇数サンプル 0025 Start: 0  
偶数サンプル 0026 Start: 1 // これは効いた  
奇数サンプル 0027 Start: 0  

結局、60spsでサンプルしているのと同じ解像度でしか入力を読み取ってくれていないようです。残念。 尚、偶数・奇数というのはどの時間を0とするかで変わります。

とりあえず意識すること

コントローラは単に120sps(実質60sps)でボタン状態をポーリングしているだけです。 こすり入力では簡単に1/120s入力が可能ですが、1/60s未満の入力は効かないのだと思って、リフ割り込みのような入力は確実にボタンを押し込むべきです。