2014/11/16

USB HIDデバイスのクリックの最速応答を考える

rafa様が公開されている超有益かつ膨大なデータである下記事ですが,つい最近最速のマウスが更新されました.

rafalog: ゲーミングマウスのクリック応答特性を比較する The measurement of gaming mouse button lag
http://utmalesoldiers.blogspot.jp/2013/02/114.html

記事によると,TL8のG300と比較して1.2ms高速というのが最速値です.

「じゃあ,ただのデバイスオタクがファームウェアを書いたらどうなるの?というか限界まで簡略化すればどこまで速くなるの?」という疑問があるわけでして,レッツトライでございます.


ファームウェア

ソースはこんな感じ.
-------------------------------------------------------
ここまで初期化(USB,Clockのスタート等)
while(1)
    {

        //USBのACK待ち
        while(!USBFS_1_GetEPAckState(MOUSE_ENDPOINT));


        //Pin_1を読んで,Lowなら右クリックが押されたとして記録
        mouseData[0] = (!Pin_1_Read())*2;


        //USBコンポーネントに右クリックの状態のデータを送る
        USBFS_1_LoadInEP(1u, mouseData, MOUSE_DATA_LEN);
    }

-------------------------------------------------------
3行,というかACK待ちとかUSBのコンポーネントへデータ転送する処理以外は一行というファームウェアです.アセンブラで考えるとざっと数~十数クロックでしょうか.APIの処理時間は良くわかりませんが:D
これならCPUは33MHzで動いているので1μs以下で終わるはずです.

これでスイッチのON/OFFを読んでUSBで転送するだけのマウスの出来上がり.


測定方法,スイッチングについて

基本的な測定方法はrafa様の記事と同様ですので割愛.都合でマウスはG300rですがリネーム品なので変わらないはず.

しかし,私の書いたファームウェアの方はチャタリング処理を入れていないのでスイッチングはPSoC5LPで電子的にやってもらいます.

Pin_1が入力,つまり右ボタンです.G300の方を左ボタンとします.
Pin_2はスイッチです.1秒間に一度ONになります.(構成の都合で1024Hzを1024で割っています.)
このクロックは初期化時にClock_1_Start();を呼べば後はMCUのCPUを介さず勝手に動くので処理時間に影響はありません.


測定結果

生データです.良きに計らって下さい.
G300r vs LogicalGaming Advanced Technological Demonstrator Mouse
https://docs.google.com/spreadsheets/d/14YjSU0z3lwasOa2duRpI_JlFT0zq0COzGRFpRNL1nhQ/edit?usp=sharing

平均はG300rと比較して,0.76ms高速という結果になりました.

データを見ると0.1~0.3msのものと1.0~1.2msのものが多いですね.これはポーリングのタイミングにたまたまあぶれた時のばらつきだと考えられます.
ここで1ms以上差がある場合に関してのみデータを拾って平均を取ると,1.09msとなります.
これはIkariと同じくらいの値です.ここから考えると,TL8とIkariはおそらく割り込みを使っていて,スイッチが押された瞬間に最優先でボタンが押された旨を転送するルーチンを持っていそうです.
ここらへんの機種は,かなり気合が入っていると思います.



まとめ

測定結果から考えると以下のことが分かります.

・上位陣のIkariやTL8はおそらく割り込みを使って最優先で処理している
・G300から-1.1ms程度がUSBの仕様上の最速で,IkariとTL8より劇的に速い機種は存在しないはず

上位の機種はチャタリング対策は転送した後にやっているんだと思います.
おそらく,「押されたらまず転送,その後の十数msはスイッチの状態に関わらず押したままにする」という感じでしょう.確かに毎秒100連射出来る人なんていませんしこれでも良いです.
というか私も最近こういうコード書きました.

2 件のコメント:

  1. systema様

    これはまた流石といいますがディープで興味深い記事ですね。ホイホイ釣られて参りました。
    PSoCは電子スイッチの構築がこんな視覚的にできるのですか。

    やはりBouncing処理後に転送していては実現不可能な速度だったのですか。
    道理で大量に計測してもLogitech-1ms前後のラインより速いブツが出てこないわけです。

    BloodyはA4tech後期時代からクリック応答にこだわっているのを知ってましたし
    最近の製品なので納得の結果なのですが
    Ikariは既に7年も前の製品で現在でも最速ですから驚愕です。私も思わず前かがみに、、、
    当時としては真にゲーミング用途を考えてコーディングされたファームウェアだったようですね。

    今後ブレイクスルーとして考えられるとすればUSB2.0 high-speedインターフェースにして
    128μsでPollingするとかですかね。
    systema様ご説明の信号の立ち上がり即転送方式と組み合わせれば
    ZeroLatencyと言える次元に達しそうです。
    ここまでくると現在の低速な描画インターバルとの差が開き過ぎて
    HIDとしてはやり過ぎ感が否めないですがロマン重視ということで:p

    返信削除
    返信
    1. rafa様

      コメントありがとうございます.
      rafa様の記事のコメント欄がなんだかすごく興味深い事になっているようなので勝手に続報に期待しております :D

      Ikariはすごいですね.Ikariの開発チームの中にレイテンシに関心が高い人が居たのかもしれません.これを見ると,ちょっとIkariが欲しくなりました.機会があれば探したいです.

      仰るとおり,-1msが「(ほぼ)ゼロレイテンシ」基準になりそうです.
      現状でも,Ikariクラスならスイッチ→USBまでのレイテンシは1ms以下と言えそうです.

      rafa様の仰る様に,これ以上レイテンシを縮めるにはHIGH SPEEDに対応するしか無いと思います.2000Hzマウスもチラホラ出てくる風潮がありますし,そういう流れになっていくのかもしれません.
      しかし,やはりディスプレイやGame Engine等のシステムの遅延と更新頻度が大きすぎて,1ms以下の削減は全体から見ると効果薄ですね:D

      削除