1/59.94秒の世界で生きてる

数msの遅延にうるさいけど待ち合わせには30分遅刻するゲーマー向けのブログ

ビデオゲームのポーリングレート, ドライバのオーバークロックで入力遅延を安定させる方法

スポンサーリンク

コンソール向けのUSBコントローラーのデフォルトドライバはポーリングレートが250Hzや125Hzに設定されていることが多いです。
PC接続時に1000Hzにオーバークロックした方が良い理由を原理から書きます。

 

メリットを受けるユーザーはPCで低HzのUSBコントローラーを使用するゲーマーです。

ゲーム用途のマウスキーボード以外の入力デバイスは殆どが低Hzなので、ゲームパッドアケコンの使用者となると幅広いと思います。

他には知識として知っておきたいって方にもちょっと役に立つ記事かもしれません。

(自分が調べた時は詳細が英語の情報ばかりで苦労したので。)

 

ファイティングエッジ刃のドライバをオーバークロックする前と後の検証が以下。

inputlag.science

 

 

ポーリングレート

ポーリングレートとは「1秒間の情報更新回数」です。

PCゲーマーはマウスやキーボードの話でよく聞く単語だと思います。

1000Hzだと1ms、500Hzだと2ms、250Hzだと4ms、125Hzだと8msに一回ずつ入力情報を更新します。

「1秒60Fのゲームだと1Fが約16.68msだから、125Hzで十分じゃないの?」って思った方いると思いますが十分ではないです。

理由はゲームエンジンとデバイスのポーリングレートは同期していないからです。

 

ポーリングレートはデバイスだけの話だと思われがちですが、ゲームエンジン側にもポーリングレートはあります。

1秒59.94F(一般的に1秒60Fと呼ばれているゲーム)の場合は最低でも59.94Hzでポーリングしています。

「最低でも59.94Hz」と書いたのはフレーム以上の周期でポーリングしてるゲームもあり、理由は入力遅延が減るからです。

わかりやすくするためにデバイス側のポーリングレートを無視します。∞Hz(入力と同時に更新)だと仮定しても良いです。

1秒59.94Fでポーリングレートが59.94Hzのゲームの場合は1Fごとに入力を拾い、約16.68ms(1F)前までに済ませた入力を反映します。(遅延1F)

入力遅延1Fの理由は、拾った入力の処理をする時間が必要で次のポーリングでの反映になるからです。

1秒59.94Fでポーリングレートが119.88Hzのゲームの場合は1Fの中間にも入力を拾うので約8.34ms(0.5F)前までに済ませた入力を反映できます。(遅延0.5F)

ビデオゲームの総合的な遅延は他にもいろいろ含めますが、ゲームエンジンのポーリングレートに絞った話です。

上記の「以降の入力は次のフレームでの反映になるゲームエンジンのポーリング」をRelevant Pall(レラバントポール)と呼びます。

レラバントポールの数はポーリングレートではなくフレームレート依存です。

59.94F59.94Hzと59.94F119.88Hzでポールの数は違いますが、1F内で入力を最後に拾うポールの位置が違うだけでレラバントポール自体は1秒に59.94個です。(単位がおかしいですがあくまでイメージ)

 

余談ですが59.94Hzという中途半端な数値は白黒テレビからカラーテレビに移行する際に周波数を変える必要があったからです。

www.jstage.jst.go.jp

 

ゲームエンジンとデバイスの同期ズレ

バイスのポーリング~レラバントポール間の話です。

わかりやすくするためにポーリングレートの項目で解説したレラバントポール~ゲームエンジンのポーリング間の遅延は無視(0F扱い)して計算します。

 

例として59.94F59.94Hzのゲームで250Hzのコントローラー(PS4向け有線コントローラー)を使用した前提とします。

結論から書くと1Fの入力受付が基本は16msで1Fごとに入力遅延が0.68ms増加し、遅延が4msを超えるフレームで入力受付を20msにして遅延を相殺します。

Switch(125Hz)の場合は基本16msで最大遅延8msまで、遅延相殺時のフレームの入力受付が24msです。

PC接続時にドライバをオーバークロック(1000Hz)して基本16msで最大遅延1ms、遅延相殺時のフレームの入力受付17msで抑えようという話です。

 

59.94Hzのゲームは約16.68msに一回情報を更新します。

250Hzのコントローラーは4msに一回情報を更新します。

ゲームエンジンとコントローラーは別々に更新を行っており、同期が取れていない周期なので割り切れず余りが発生します。

レラバントポールを超える直前、16.68/4=4+0.68の余りの0.68msにコントローラーを入力した場合、ゲームエンジン側のタイミングでは次のフレームに間に合うように入力されているのに入力が読み取られず反映が1F遅れます。

なので1F目は「遅延0msで入力受付16ms」、2F目は「遅延0.68msで入力受付16ms」です。

次のレラバントポールに辿り着く直前は前の余りと合わせて0.68+0.68=1.36ms遅延します。

3F目は「遅延1.36msで入力受付16ms」です。

その後も遅延を繰り返した後、6F目の遅延と余りの合計が3.4+0.68=4.08msで4ms(250Hzのポーリング間隔)を超えます。

バイス側のポーリングがレラバントポール間に一回多く発生し、入力受付を増やして蓄積した遅延を相殺します。

6F目は「遅延3.4msで入力受付20ms」です。

相殺した分で次のフレームでは遅延が軽減されます。

4.08-4=0.08

7F目は「遅延0.08msで入力受付16ms」です。

以下ループ。

いろいろ省略した結果、「250Hzのデバイスは遅延4ms」と言われているわけです。

20msの数値だけ見ると「入力時間が増えてるなら良くね?」と思いますが、本来であれば一つ前のフレームの入力が遅れているだけなのと、その分他のフレームが遅延しています。

これがデバイス側のポーリングレートが低いことにより発生する同期ズレの遅延です。

 

ゲームでの具体例です。

1秒59.94FのゲームでAを入力した約16.68ms後にBを入力します。

1F=約16.68msなのでAが入力された1F後にBが入力されるはずが、ポーリング周期が悪いタイミングでAを入力しているとAとBの同時押しになり、ポーリング周期が悪いタイミングでBを入力しているとAの2F後にBが入力されます。

 

実際にどれくらいの頻度でズレが起こるのかは下記にグラフと共に記載されています。

前述した一般的なコントローラーの250Hzではなく、125Hzのデバイス(ニンテンドー ゲームキューブ コントローラ 接続タップ)の検証ですが参考になると思います。

docs.google.com

 

固定フレームレートのゲームだけでなく、可変フレームレートのゲームをPCパッドでプレイする方にも関係しています。

250fps↑のゲームをPS4コントローラー有線接続デフォルト(250Hz)でプレイするとデバイス側よりゲーム側のポーリングレートが高くなるので入力を受け付けないフレームが存在します。

 

特異な事例だとコンソールゲームのスマブラDX(59.94F119.88Hz)の同期ズレの解説動画が以下です。

youtu.be

結果だけ簡略化してまとめると

ゲームエンジンと描画の同期が取れておらず、ゲーム起動から1000F後にゲームエンジンのポーリングレートが変わり入力遅延が1F増加。

以降ゲームエンジンとデバイスの同期が取れなくなって毎フレーム最小0ms(デフォルト)~最大約8.34msの同期ズレが起き、更にデバイスのポーリング500Hzごとにレラバントポールがズレて遅延が約8.34ms(デフォルト)と約16.68msを往復。

このレラバントポールが往復する現象をPolling Frift(ポーリングドリフト)と呼びます。

(今は修正Modが有志にリリースされました。)

 

コントローラーのデフォルトドライバのポーリングレート一覧

簡易まとめ

 

PS5&PS4

有線→250Hz

無線→800Hz

 

Switch

有線→125Hz

無線→125Hz

 

Xbox360(PS4向けアケコンのPCモードなど)

有線→250Hz

 

Brook Universal Fighting Board(自作コントローラーで最強とされる基板)

有線→1000Hz

 

基本的には有線でのオーバークロック推奨ですが、もし無線でPCに繋げる場合は汎用のBluetoothレシーバーは使わずに付属もしくは純正のUSBレシーバーを使用してください。

マウスの検証しか見つからなかったのですが、汎用のBluetoothレシーバーは純正USBレシーバーと比べてポーリングレートが落ちます。

www.rtings.com

メーカーの公表でも付属レシーバー無線接続1000HzのマウスをBluetooth接続すると88~133Hzになります。

仕様の感応度を参照

gaming.logicool.co.jp

 

 

各ソースは以下です。

 

コントローラーのポーリングレート検証(グラフ付き)

PS4コントローラー無線が1ms(1000Hz)記載だけど恐らく1.25ms(800Hz)のミス。

inputlag.science

 

コントローラーのデフォルトポーリングレート一覧

www.consoletuner.com

 

システム側のポーリングレート一覧

www.consoletuner.com

 

ドライバのオーバークロック

ドライバの変更自体は自己責任でお願いします。

違うドライバに下手にフィルタをかけると対応したデバイスが正常に動作しなくなる可能性があります。

 

一時期日本でもFortniteやCall of Dutyの界隈で「デバイスの遅延を4msから1msに軽減できる」と話題になったのですが、厳密にはデバイスの遅延自体を常時減らすものではなく、ドライバの読み取り頻度を向上させてゲームエンジンとデバイスの同期ズレによる遅延を減らすものです。

 

hidusbfを使います。

github.com

 

「hidusbf.zip」をクリック。

f:id:sobameshifox:20210418192327p:plain

 

「Download」をクリック。

f:id:sobameshifox:20210418192550p:plain

 

ダウンロードしたzipファイルを解凍、Setup.exeを起動します。

f:id:sobameshifox:20210418192559p:plain

 

左上のタブを「Mice」から「All」に変更。

f:id:sobameshifox:20210418192603p:plain

 

文字化けしてますが無視して該当のUSBデバイスを探します。

「bInterval」の項目がポーリング感覚ですので、該当のUSBデバイスのポーリングレートを参考に探しましょう。

自分の場合はPCモードのQanba Obsidianですが、一番下の「XBOX 360 CONTROLLER」でした。

画像の場合は1となってるのがマウスとキーボード、2がスタンドマイク、8がウェブカメラ、空白が外付けHDDとカードリーダーです。

該当デバイスを見つけたら抜き差ししてください。

抜いた時に一覧から消えるので確認ができます。

再度デバイスを接続した状態で該当デバイスをクリックしたら、左下の「Filter On Device」にチェックを入れ、「Default」タブを「1000」に変更し、「Install Service」をクリック。

f:id:sobameshifox:20210418192607p:plain

 

「Filter」がYes、「Rate」が1000になったのを確認したら該当のUSBデバイスをもう一度抜き差ししてください。

f:id:sobameshifox:20210418194337p:plain

 

「bInterval」が1になっていたら完了です。

念のためにPCを再起動しても1になっているか確認しましょう。

f:id:sobameshifox:20210418194342p:plain

 

FAQ

数msの遅延って気付かなくない?

気付くか気付かないかは人に寄りますが論点が違います。

同じ入力をしてもゲーム側の周期で気付かない内に入力ミスとされるタイミングがあるという話です。

根性入力の精度を上げること自体はすごいので、やり込みを否定する意味でもないです。

 

なんでゲームエンジンとデバイスで同期を取らないの?

USBデバイスが2の冪乗ごとにしかポーリングできないからです。

wiki.archlinux.jp

プリンタケーブル接続に改造したコントローラーやレトロゲーム機が最強と言われる理由です。

 

なんでコンソールはPCと同じ1000Hzにしないの?

理由は主に二つで

①システムやゲームが対応していないことがある。

②顧客層が違う

1000Hzのポーリングレートに対応するにはある程度のスペックが求められます。

システムやゲームが対応していないと想定外の挙動をします。

それを防ぐために環境が統一されているコンソールには繋ぐだけで簡単に想定内の挙動をするデバイスが作られます。

対して環境が統一されていないPCには各々の環境に合わせてカスタマイズが行えるデバイスが作られます。

だからコンソール向けデバイスは高スペックのものが少ない代わりに使いやすい物が多く、PC向けデバイスは高スペックだけど繋いでも設定をあれこれしないと使えなかったりする物が多いわけです。

バイスの話とは反れますが、ゲーム自体の垂直同期がオンオフできるかどうかや、画質やネット対戦のディレイフレームなどが自動設定か選べるかなども同じです。

コンソールとPCそれぞれにメリットがあって顧客層も違うので、それぞれにあったものを作っているのです。

 

結局は何Hzでデバイス使えば良いの?

システムとゲームとデバイスが不具合を起こさない範囲の高Hzです。

最低でもゲームのポーリングレートより高いHzが良いです。

PCとUSBデバイスは規格的に1000Hzまで対応しているので1000Hzまでは低スペックPCでない限り問題ありません。

ゲームによっては高いと入力が飛んだりする場合があるので理想はゲームごとに動作確認しましょう。

github.com

 

結局1000Hzでも同期ズレしてるんじゃないの?

してます。

が低Hzよりかなりマシです。

耐えられない人はポーリングレート10000Hzくらい対応のゲームとデバイスに期待しましょう。

最近はメーカーも4000Hzや8000Hzとがんばってるみたいです。

まだゲーム側が対応してませんが。

razerzone.jp

 

オーバークロックしてPCやデバイス壊れないの?

(このオーバークロックは)壊れません。

ただし動作を保証するものでもないです。

PCもUSBデバイスも1000Hzで動作する規格です。

行っていることも「USBデバイス自体のオーバークロック」ではなく「1000HzのUSBデバイスを1000Hzのシステムに接続した時にデフォルトでインストールされたドライバ(250Hz)にフィルタをかける」です。

PCゲーマーだと馴染みあると思いますが「このデバイスはPCに接続しただけだとこの機能使えないからこのドライバをダウンロードしてね」みたいな話と同じです。

PCパーツのオーバークロックのような物理的な負荷がかかるものとは少し違います。

前述しましたがドライバの変更自体は自己責任でお願いします。

 

これチートじゃないの?

現状はチート扱いされていません。

何をチートとするかはレギュレーションで変わるので既存のPCゲーム界隈の話になりますが、FortniteやCall of Dutyの競技シーンで使用されています。

前述しましたが動作自体もマクロなどではなくUSBデバイスの規格通りです。

レギュレーションを決める側の方にとっては話が変わってくるとは思いますが、プレイヤー目線の話では現状で規制されていないものを必要以上に気にしても仕方が無いです。

もし規制されたらデフォルトドライバが1000Hzの基板でコントローラーを自作しましょう。