V-Sync完全ガイド:ティアリングの原理とVRR/Adaptive Syncの実装と運用

V-Syncとは — 基本の理解

V-Sync(Vertical Synchronization、垂直同期)は、グラフィックスカード(GPU)が描画したフレームとディスプレイのリフレッシュ(垂直走査、vertical blanking)を同期させる仕組みです。主な目的は「ティアリング(画面の横切り割れ)」を防ぐことで、ディスプレイが1回の走査で複数のフレームの途中を表示してしまうことを避けます。映像再生やゲームの視覚的連続性を担保するための古典的かつ基本的な技術です。

なぜティアリングが起きるのか(原理)

ディスプレイは一定のリフレッシュレート(例:60Hz = 1秒間に60回)で画面を上から下へスキャンして表示します。一方でGPUはフレームをできるだけ速くレンダリングします。GPUのレンダリング完了とディスプレイの走査タイミングが揃わないと、ある走査の途中でバッファが切り替わり、上半分は前のフレーム、下半分は次のフレームというように「断層」ができ、これがティアリングです。

V-Syncの仕組み(技術的な概要)

  • 垂直ブランク待ち(vblank wait): GPUがフレームバッファの切り替え(バッファスワップ)を、ディスプレイの垂直走査(vblank)期間まで遅延させる。これによりスワップが走査の区切りで発生し、ティアリングが防止される。
  • スワップインターバル: 一部APIやドライバでは、ディスプレイのvblankごとに何フレーム分進めるか(通常は1)を指定できる。インターバル1が一般的なV-Sync。
  • バッファリング: ダブルバッファ(フロント/バック)やトリプルバッファを使ってレンダリングと表示を分離する。バッファリングの方式によって遅延やスタッタリングの挙動が変わる。

バッファリングの種類とその影響

  • ダブルバッファ: 一方で描画し、もう一方を表示。描画完了がvblankに間に合わない場合、GPUは次のvblankまで待機し、フレームレートがディスプレイのリフレッシュに制約される。ティアリングは防げるが、フレームがドロップするとカクつき(スタッタ)が起きることがある。
  • トリプルバッファ: バックバッファをもう1つ増やし、GPUは次のフレームを待たずにレンダリングを続行できるため、スタッタ軽減に有効。ただし、追加バッファ分だけ表示までの遅延(入力遅延)が増える場合がある。
  • Mailbox(先行上書き): Vulkan/OpenGLの実装やドライバで使われることがあるモードで、最新の完成フレームをキューに置き、次のvblankで最新フレームを即座に提示する。低遅延かつティアリング防止を両立しやすい。

V-Syncの利点と欠点

  • 利点: ティアリングを確実に防ぎ、映像が滑らかに見える。特にカメラワークや横スクロールなどで視覚的に重要。
  • 欠点: 入力遅延が発生する(フレームがvblankを待つため)。GPUのレンダリングがリフレッシュに追いつかないとフレームレートが大きく低下し、結果としてスタッタや体感ラグが増えることがある。

Adaptive V-Sync / Fast Sync / Enhanced Sync — 各メーカーのアプローチ

固定V-Syncの欠点を補うため、GPUメーカーや標準化団体は複数の拡張機能を提供しています。

  • NVIDIA Adaptive V-Sync: フレームレートがディスプレイリフレッシュを上回る時はV-Syncを有効にしてティアリングを防ぎ、逆にフレームレートが下回る場合はV-Syncを無効化してスタッタや高遅延を回避するという動作をします。
  • NVIDIA Fast Sync: トリプルバッファに似た考えで、最新の完成フレームだけを表示する方式により、V-Syncの遅延を抑えつつティアリングを回避します。ただし、GPUが高フレームレートを非常に安定して生成できることが前提です。
  • AMD Enhanced Sync: AMDの同等機能で、Fast Syncと同様に遅延とティアリングのトレードオフを改善する設計です。
  • VESA Adaptive-Sync(FreeSync) / NVIDIA G-SYNC: ディスプレイ側がリフレッシュレートをGPUの出力に合わせて可変にし、ティアリングを防ぎつつ低遅延で表示する「可変リフレッシュレート(VRR)」技術です。V-Syncとは原理が異なり、より本質的に問題を解決します。

現代のAPI/標準における提示モード

VulkanやDirectX、OpenGLでは、スワップチェーンや提示(present)モードに関する選択肢が標準化/実装されています。代表的なモード:

  • FIFO: ディスプレイのvblankキューに従う(古典的なV-Syncに相当)。ティアリングなし。
  • MAILBOX: 最新フレームをキューに上書きしてvblankで提示。低遅延でティアリング防止に有効。
  • IMMEDIATE: 完成したらすぐフロントバッファにコピー(あるいは切替)。ティアリングが起きる可能性があるが遅延は最小。

(VulkanのVK_PRESENT_MODE_*や、DirectXのSwapEffect/PresentFlags、OpenGLのswap control拡張などを参照)

実際の運用上の注意点・ベストプラクティス

  • ゲーム用途: 競技志向のゲームでは遅延を最小化したい。VRR対応モニタ+VRRを使うか、V-Syncを切ってフレームレート制限(例えばディスプレイ周波数より少し低め)を併用することが多い。フレームレート上限をリフレッシュレートの99〜100%程度に設定することで、V-Syncの大幅低下を防ぎつつティアリングを最小化できる場合がある。
  • 映像視聴・単純なシングルプレイヤーゲーム: 視覚の滑らかさを優先するならV-Syncを有効にするのが一般的。VRRがあれば最も良い解。
  • トリプルバッファやFastSyncを乱用しない: 高フレームレート下では有効だが、GPU負荷が高く不安定な状況では逆に遅延や不一致が出ることがある。
  • フレームキャッピング: 垂直同期と組み合わせる場合、フレームキャップを用いて意図したフレームレート域を維持することで不意のスタッタを防げる。

開発者向けの実装上の注意

ゲームエンジンやリアルタイムアプリを作る際は、V-Syncを単にオン/オフするだけでなく複数の提示モードやバッファリング戦略を用意し、ユーザーの環境(VRR対応の有無、モニタのHz、GPU能力)に応じて選べるようにすることが望ましい。具体的には:

  • プレゼンス(Present)APIで利用可能なモードを列挙して、最適なものを優先的に選択する(例:MAILBOX → FIFO → IMMEDIATE のように優先順を付ける)。
  • フレームタイミングを細かく計測し、フレーム作成時間と表示タイミングの関係を把握してフレームレートキャップやバッファ数を調整する。
  • 入力遅延の計測(エンドツーエンド)を行い、ユーザー体感を最小化する設計を行う。

まとめ — いつV-Syncを使うべきか

V-Syncは「ティアリングを防ぐ」ための有効な古典技術ですが、遅延やスタッタの問題を抱えることがあります。最新の最良解は可変リフレッシュレート(VRR:G-SYNC / FreeSync)ですが、これが使えない環境では以下の指針が参考になります。

  • 視覚の滑らかさを最優先する場合:V-Sync(またはFIFO系モード)を使う。
  • 反応速度(入力遅延)を最優先する場合:V-Syncを切る、あるいはVRR対応モニタを使う。フレームレートに上限を設けて安定させること。
  • 混在する環境では:Adaptive V-Sync / Fast Sync / Enhanced Sync や、MAILBOXモード(可能な場合)を検討する。

最終的にはハードウェア、ドライバ、アプリケーションの組合せで最適解が変わるので、実機での計測とユーザ設定の柔軟性が重要です。

参考文献