2016/12/03

描画遅延とデバイスの出力周期の関係に関する一考察

はじめに

描画遅延(入力遅延とも言います)は,競技ゲームにおけるプレイヤーのパフォーマンスに大きく影響します.本記事は,ゲーミングシステムを構成するゲーミングデバイスやプログラムの出力周期に着目して,描画遅延の定式化を行い,描画遅延を減らすために要求されるシステム要件について議論します.

記事が長いので,「理屈はどうでも良い」という方は最後のまとめの項だけ参照してください.

出力周期

ゲーミングシステムは,ヒューマンインタフェースからの入力を,ゲームエンジンが受け取り,その情報に基いてディスプレイに描画します.これらのデバイスやプログラムはそれぞれ出力周期を持っています.

以下にそれぞれのデバイス,プログラムの一般的な出力周期とその名称を示します.

  • マウス,キーボード,コントローラ
    • レポートレート : 125Hz~1000Hz
  • ゲームエンジン(ゲームプログラム)
    • フレームレート : 30fps~500fps
  • ディスプレイ
    • リフレッシュレート : 60Hz~240Hz

遅延時間の見積もり

単純化した例

遅延時間も見積もるために,単純化した例で議論します.まず,マウスからの入力がリフレッシュレートが1Hzのディスプレイに出力された例を考えます.この時,入力された情報はデバイスやプログラムには即時反映されるものとします.

図1 リフレッシュレート1Hzの場合の遅延時間

図1に,リフレッシュレートが1Hzの場合の遅延時間について,最良・最悪・平均(期待値)の3パターンの入力と描画のタイミングを示します.

図1のように,入力の直後にディスプレイがリフレッシュされる場合,入力結果がディスプレイに即反映されるため,遅延時間は0sとなります.一方,リフレッシュ直後に入力がされる場合,入力結果は1s後にディスプレイに反映されるため,遅延時間は1sとなります.

プレイヤーによる入力のタイミングはランダムであるため,入力のタイミングは一様に分布することになります.したがって,遅延時間の期待値は,0s~1sの中間の0.5sとなります.

このように,遅延時間の期待値はディスプレイの出力周期に依存します.例えば,リフレッシュレートが100Hzの場合,最短の遅延時間は0sであり,最長の遅延時間は0.01sとなります.つまり,遅延時間の期待値は0s~0.01sの中間である0.005sとなります.

以上を踏まえると,1つの出力周期をもつシステムの場合,遅延時間の期待値t[s]は出力周期r[Hz]を用いて以下の式で表すことができます.
t = 1/2r


複数の出力周期が存在する場合

次に,複数のシステムが連なった時の例を考えます.レポートレートが1Hzのマウスとリフレッシュレートが1Hzのディスプレイで構成されている場合を考えます.
レポートレート1Hz,リフレッシュレート1Hzの場合の遅延時間


図2に,リフレッシュレートが1Hzのディスプレイとレポートレートが1Hzのマウスから成るシステムの場合の遅延時間について,最良・最悪の2パターンの入力と描画のタイミングを示します.
それぞれのデバイスは同期をしていないため,それぞれの出力(描画)タイミングはランダムになります.

図2のように,最良のケースでは入力の直後にマウスがレポート,その直後にディスプレイが描画することになり,遅延時間は0sとなります.一方最悪のケースでは,マウスのレポートの直後に入力が起き,1s後に入力された情報をレポートし,さらに1s後にディスプレイが描画するため,遅延時間は2sとなります.
したがって,それぞれのデバイスの同期タイミングと物理的な入力のタイミングを加味すると,遅延時間の期待値は1sとなります.

ゲームエンジンについて考えると,図2のマウスとディスプレイの間にゲームエンジンのタイミングが追加されます.この場合は,ゲームエンジンの出力周期に応じて描画遅延の期待値は増加します.つまり,ゲームエンジンの出力周期(フレームレート)を上げれば,描画遅延の期待値は減少し,フレームレートが下がれば期待値は増加することになります.

以上ように,複数のデバイス/プログラムが出力周期をもつ場合,全体の遅延時間はそれぞれのデバイス/プログラムの遅延時間の期待値の合計になります.


遅延時間の定式化

以上を踏まえると,出力周期に基づいた遅延時間の期待値は以下のように見積もることができます.全体の遅延時間をT[s]とし,それぞれの出力周期をr[Hz]とすると,Tはシステムを構成するデバイスとプログラムの遅延時間tの合計値となるため,以下のようになります.
T = Σ(1/2r)


実際のシステム構成の場合

マウスのレポートレートが1000Hz,ゲームエンジンのフレームレートが200fps,ディスプレイのリフレッシュレートが120Hzである場合は,以下のように遅延時間を見積もることができます.
T = (1/(2*1000))+(1/(2*200))+(1/(2*120)) = 0.00716[s] = 7.2[ms]


出力周期以外の遅延時間(オーバヘッド)

今までの例は,入力された情報をそれぞれのデバイス/プログラムがすぐに次のデバイス/プログラムに渡せる場合を考えてきました.しかし,実際のシステムにおいては,出力周期以外の遅延時間(本記事ではオーバヘッドと呼びます)が存在しています.
今回は以前行った測定データ(図3)から,それらのオーバヘッドを見積もることにします.

図3 ゲームタイトルごとの描画遅延
※測定方法/環境については当該記事参照

まずは,Baselineのプログラムについて考えます.このBaselineのプログラムは4300fps程度で動作します.したがって,出力周期から見積もれる遅延時間は,
T = (1/(2*1000))+(1/(2*4300))+(1/(2*120)) = 0.00478[s] = 4.8[ms]
となります.しかし,実際に測定された描画遅延の時間は8.4msです.したがって,残りの3.6msはUSBホストコントローラ,OS,OpenGLのAPI,グラフィックカード,ディスプレイなどがもつオーバヘッドであるといえます.

次に,CS:GOのSource Engine自体がもつオーバヘッドについて考えます.CS:GOのde_dust2は私の環境ではおよそ200fps程度で動作していたと思うので(うろ覚えですいません),出力周期から見積もれる遅延時間は,
T = (1/(2*1000))+(1/(2*200))+(1/(2*120)) = 0.00716[s] = 7.2[ms]
となります.ここに測定環境のオーバヘッド3.6msを足した10.8msが出力周期とシステムのオーバヘッドから予想できる描画遅延ですが,実際は15.7msとなっています.この差のゲームエンジン自体のオーバヘッドである4.9msは,OSから受け取ったマウスの変位からカメラの姿勢計算などを行い,グラフィックカードへのデータ転送,グラフィックカードが描画処理(ラスタライズ,シェーディング,ポストプロセスなど)を行うための時間だと考えられます.

CS1.6はフレームレートの制限があり,全体の描画遅延はCS:GOと大きく変わりませんが,フレームレート制限の分を加味すると,ゲームエンジン自体のオーバヘッドはCS:GOと比較して小さいと言えます.この差は,CS1.6からCS:GOでグラフィックがリッチになった影響で,グラフィックパイプラインがより深くなり,ゲーム内の内部処理もより複雑になったためだと考えられます.

ゲームエンジンの高度化,グラフィックのリッチ化は多くの一般的なプレイヤーにとって利益になります.しかし,コンペティティブなタイトルでは描画遅延の増加というトレードオフも存在しており,競技性を意識したタイトルでは慎重に調整するべきだと思います.


遅延を減らすためにプレイヤーができること

遅延時間を少なくするためには,それぞれの出力周期を上げる必要があります.
つまり,マウスに関して言えば,レポートレートをできるだけ高くすることです.デバイスの設定によって1000Hzや,設定できるのならそれ以上の値に設定します.
また,プロセッサとメモリを高速なものに移行することと,ゲーム内設定をできるだけ低負荷なものにすることでフレームレートを上げるのも有効です.
そして,リフレッシュレートの高いディスプレイに置き換えることも有効でしょう.
デバイスやディスプレイを買い換える場合は,余計な遅延が発生するようなものは避けることが必要です.

特に,フレームレートはゲームの設定を調整するだけで容易に改善できます.フレームレートを上げるには,レンダリング解像度やテクスチャ解像度,シェーディングなどの設定を下げるとよいでしょう.グラフィック設定は基本全部低設定にして,視認性に影響を与えない範囲でレンダリング解像度を下げるというのがよいでしょう.


まとめ

まとめます.

  • 出力周期に基づく描画遅延時間の期待値はΣ(1/2*出力周期)で表すことができる
    • 遅延時間はそれに加えて,プログラムの計算時間やデータ転送時間などの要素で増加する
  • 出力周期を小さくすることで描画遅延時間を小さくできる
    • デバイス
      • デバイスのレポートレートを上げる
      • レポートレートの高いデバイスを買う
    • ゲーム(エンジン)のフレームレートを上げる
      • CPU・メモリ・GPUを高速なものに買い換える
      • グラフィックの設定(解像度,その他)をできる限り下げる
    • ディスプレイのリフレッシュレートを上げる
    • リフレッシュレートの高いディスプレイに買い換える
  • 描画遅延の中でオーバヘッドが占める割合は大きく,プレイヤーが出力周期を上げることで対応できる範囲は小さい
    • 描画遅延を極限まで小さくするには,より小さいオーバヘッドのシステムを考える必要がある
      • 今までのソフトウェア資産を失うことになるため,システムのアーキテクチャ自体を大きく変える事はとても難しい
      • オーバヘッドの小さいゲームエンジンを高く評価するような雰囲気づくりが必要

2 件のコメント:

  1. Hi Systema,

    AMD suggests that its Radeon Chill software can reduce frame time delivery to display. Maybe it's true but I don't think it will help input lag. Could you test this?

    返信削除
    返信
    1. Hi traumerei. Thank you for your comment.

      Unfortunately, I can not test it because I do not have an AMD GPU.

      Anyway, Radeon Chill is an interesting feature.
      However, this seems to work only with V - SYNC or games using multiple rendering buffer frames.

      The illustration on page 55 on the slide cited in your blog seems to be an algorithm. Radeon Chill seems to be a technique that reduces the number of buffer frames and overlaps rendering and calculation.
      (Reference: http://www.4gamer.net/games/022/G002212/20161205088/screenshot.html?num=017)
      If this technique can be applied to double buffering which is a commonly used method, input lag may be made smaller by overlapping.

      Best regards.

      削除