ゲームラグ白書 › L1 クライアントのゲームプロセス
V-Syncとレンダーキュー V-Sync, render queue
原因ID cg-vsync · 主担当 ゲーム開発チーム・クライアント開発 · 副担当 外部・外部
図と実験のあるメインページでこのカードを開く →
GPUが描画したフレームを何枚かキューにためておき、モニターの周期に合わせて出力する間、入力が遅れます。
なぜ グラフィックドライバーがフレームを1〜3枚先にキューにためる → すると 入力が画面に反映されるまで、その分余計に時間がかかる → 画面では Pingは低いのに、操作が重くもたつく
- 症状
- 入力遅延, カクつき
- 要因
- 遅延
- 誰に起きるか
- 自分だけ
- いつ
- 常に
- 担当
- 主担当 ゲーム開発チーム・クライアント開発 · 副担当 外部・外部
- ゲーム開発チームの対応
- 低遅延モードへの対応、フレームキューを減らす、リフレッシュレートより少し低く設定するフレームレート上限オプションの提供、スマホではフレームペーシング機能を有効化。
- 外部の対応
- ユーザーに、可変リフレッシュレート対応モニターと組み合わせてリフレッシュレートより少し低いフレームレート上限を設定すること、グラフィックドライバーの低遅延モードを有効にすることを案内。
- 数値の目安
- 60Hzでは1枚あたり16.7ms。CPUがGPUや画面の周期より速く、キューの3枚(DirectX 11のデフォルト)が埋まると、50msが上乗せされます。ダブルバッファのV-Syncでは、17msかかったフレームが次の画面更新タイミング(33.3ms)まで待ち、その間は前のフレームがもう一度表示されます。
- グラフでは
- 最初から常に高い · 入力〜画面の遅延
- 確認箇所
- PresentMonのMsClickToPhotonLatency・MsAllInputToPhotonLatency(マウス・キーボードの入力から画面への出力まで)とDisplayLatencyを、V-Sync・低遅延モード・フレームレート上限を切り替えながら比較。MsPCLatency(PCが入力を受けてから画面に送るまで)は、ゲームがPC Latencyイベントを出力する場合にだけ記録される
- 該当する場合
- V-Syncを有効にしたときやフレームレート上限がないときにこの遅延が1〜2フレーム(数十ms)増え、低遅延モードやリフレッシュレートより少し低いフレームレート上限では減る。Pingは変わらない
- 該当しない場合
- PC内の遅延は低いのに操作が遅れるなら「ディスプレイ・入力デバイス・フレーム生成による遅延」、Pingが高いならネットワーク側
- 確認手段
- ユーザー側の環境で確認
- もっと詳しく
- V-Sync(垂直同期)は、モニターが画面を切り替える瞬間にだけ新しいフレームを出力する設定です。ティアリングはなくなりますが、その瞬間を待つ分だけ入力が遅れ、FPSが60を下回ると60と30の間を行き来してカクつきます。可変リフレッシュレート(VRR)対応モニターは、フレームの準備ができたタイミングに合わせて画面を切り替えるため、この待ち時間を減らせます。スマホでも同じことが起きます。30FPSのゲームが60Hzの画面にフレームを均等に出力できないと、平均は30FPSなのに1枚あたりの表示時間が49・16・33msのようにばらつき、カクつきます(Androidの開発者向けドキュメントの例)。Androidのフレームペーシング(フレームの出力間隔をそろえる)ライブラリや、エンジンの同様のオプションで軽減します。
出典
- IDXGIDevice1::SetMaximumFrameLatency Microsoft
ドライバーがキューにためられるフレーム数のデフォルト値は3(1〜16) - Reduce latency with DXGI 1.3 swap chains Microsoft
キューが空くまでPresentがブロックされ、描画から表示までほぼ1フレーム余計に待つことになる。待機可能なスワップチェーンで減らす - Frame Pacing library Android (Google)
60Hzの画面で新しいフレームがなければ前のフレームを再表示する。30FPSのゲームのフレームタイムが49・16・33msのようにばらつく例 - PresentMon Capture Application (README-CaptureApplication.md) Intel
MsPCLatency(PCが入力を受けてから画面に送るまで)、MsClickToPhotonLatency(マウスクリック〜画面)、MsAllInputToPhotonLatency(キーボード・マウス入力〜画面)、DisplayLatency(フレームの提出〜モニターへの出力) - PresentMon Console Application (README-ConsoleApplication.md) Intel
MsPCLatencyは、アプリがPC Latencyイベントを出力しないと記録されない(--track_pc_latency)。MsAllInputToPhotonLatencyはキーボード・マウス入力が基準
あわせて読みたい原因
同じ層:L1 クライアントのゲームプロセス
同じ症状(入力遅延)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る