VSYNC徹底解説:基本概念・歴史・実装・VRRとティアリング対策の完全ガイド

VSYNCとは — 基本概念と歴史的背景

VSYNC(Vertical Synchronization、垂直同期)は、GPUが生成したフレームとディスプレイの走査(リフレッシュ)タイミングを同期させる技術です。歴史的にはCRT(陰極線管)ディスプレイの走査方式に由来し、「垂直ブランキング期間(vertical blanking interval, VBI)」と呼ばれる画面の上から下へ走査する行程の終わりに新しいフレームを表示するためのタイミングが存在しました。モダンな液晶(LCD)や有機EL(OLED)でも同様のリフレッシュ概念が残っており、VSYNCは主に「ティアリング(画面の上下で異なるフレームが混在する現象)」を防ぐために使われます。

なぜVSYNCが必要か — ティアリングの説明

ディスプレイは固定のリフレッシュレート(例えば60Hz)で画面を更新します。一方でGPUは一定のフレームレートを常に出力するとは限りません。GPUがフレームを画面の更新途中でバッファに書き換えると、ある時間帯では上半分が古いフレーム、下半分が新しいフレームという状態になり、これがティアリングです。VSYNCを有効にすると、GPUは次の垂直ブランク(次回のフルフレーム更新タイミング)まで表示バッファの切り替え(スワップ)を待ち、ティアリングを防ぎます。

実装の仕組み(ダブルバッファ・トリプルバッファ)

一般的な実装はバッファを用います。

  • ダブルバッファリング:フロントバッファ(表示中)とバックバッファ(描画中)を持ち、垂直同期で二つを入れ替える。単純だがGPUがフレームを時間内に描けないと次のリフレッシュまで待つためスタッタリングや入力遅延が発生しやすい。
  • トリプルバッファリング:フロント1つ、バック2つを持つ。GPUは常に空いているバックバッファに描けるため、フレーム描画が遅れてもGPUの利用率は落ちにくく、フレーム生成と表示のずれ(フレーム落ち)によるスタッタを軽減できる。ただしメモリ使用量と遅延のトレードオフがある。

APIごとの挙動と設定方法

各グラフィックスAPIはVSYNCを制御するための仕組みを提供しますが、APIやドライバ、OSのコンポジタなど複数の要因が絡みます。

  • OpenGL:プラットフォームに依存する拡張(wglSwapIntervalEXT, glXSwapIntervalEXT, eglSwapInterval)でスワップインターバルを設定。1で垂直同期、0で無効など。
  • DirectX(DXGI):IDXGISwapChain::Present(UINT SyncInterval, UINT Flags) の SyncInterval により垂直同期の待ちを指定(1なら1リフレッシュ、0なら即時)。
  • Vulkan:VkPresentModeKHR による。VK_PRESENT_MODE_FIFO_KHR は垂直同期が保証され、必ずサポートされるモード。VK_PRESENT_MODE_MAILBOX_KHR は低レイテンシのトリプルバッファ相当、VK_PRESENT_MODE_IMMEDIATE_KHR はVSYNC無効でティアリングが起きる。
  • ブラウザ:requestAnimationFrameは通常ディスプレイのリフレッシュに同期して実行される(ブラウザやOSコンポジタの実装に依存)。

可変リフレッシュ技術と「Adaptive」系の違い

近年はディスプレイ側でリフレッシュレートを動的に変化させるVRR(Variable Refresh Rate)技術が普及しています。代表的なのがNVIDIAのG-SyncやAMDのFreeSync(DisplayPort Adaptive-Syncベース)です。

  • Adaptive VSync(NVIDIA用語):FPSがモニタのリフレッシュ以上ならVSYNCを有効、下回ると自動で無効にしてスタッタを抑えるドライバ機能。ただし完全な解決には限界がある。
  • G-Sync / FreeSync(VRR):ディスプレイ自体がリフレッシュレートをGPUの描画速度に合わせて変化させる。結果としてティアリングなし、しかも入力遅延を小さく保てるため、ゲーム用途で高評価。

レイテンシ・スタッタリングとのトレードオフ

VSYNCを有効にするとティアリングは防げますが、GPUが毎フレームを間に合わせられない場合、フレームの表示が次のリフレッシュに持ち越され、結果として表示遅延(入力遅延)が増えます。また、フレームのスキップや不均一なフレーム間隔が起きると「スタッタリング(カタつき)」が発生します。トリプルバッファやMAILBOXモードはスタッタを緩和しつつ遅延を抑える手段です。

開発者向けアドバイス

  • ゲームやインタラクティブアプリでは「入力遅延」と「視覚的な滑らかさ(ティアリング回避)」のバランスを考える。競技系では遅延を優先してVSYNCを切る場合が多い。
  • トリプルバッファやMAILBOX相当のプレゼントモードを使えるなら、まずそちらを検討する。VulkanではVK_PRESENT_MODE_MAILBOX_KHR、DXGIではトリプルバッファを設定することで実現可能。
  • VRやヘッドトラッキングがある環境では、非同期時間ワープ(asynchronous timewarp)やリプロジェクションなどの技術がVSYNC依存の問題を補う。VRは高頻度で安定したフレーム供給が必須のため、VR用の遅延対策が別途必要。
  • フレームレート上限を設ける(フレームリミッタ)ことで、GPUが無制限に描画を行ってリソースを浪費するのを防ぎ、結果的に安定した表示に寄与することがある。上限はディスプレイのリフレッシュかVRRの範囲内に合わせる。
  • OSコンポジタ(WindowsのDWMやWayland/Compositor)の存在に注意。アプリ単体でVSYNCを制御しても、コンポジタが間に入ると実際の表示タイミングは異なる場合がある。

よくある誤解と補足事項

  • 「VSYNC=遅延の原因」は単純ではない。VSYNCはティアリングを防ぐが、遅延はGPUの描画時間やバッファ戦略と密接に関係する。
  • Adaptive VSyncとVRR(G-Sync/FreeSync)は別物。Adaptive VSyncはドライバによるトリック、VRRはディスプレイ側の機能で効果と挙動が異なる。
  • ブラウザやモバイル環境では、システムのフレーム合成(コンポジタ)によりアプリケーション側のVSYNC指定がそのまま反映されない場合がある。

まとめ

VSYNCは画面のティアリングを防ぐための基本的な手法ですが、単に有効化すれば万事解決というものではありません。遅延、スタッタリング、バッファ戦略、ドライバやOSのコンポジタ、そして最近のVRR対応ディスプレイなど多くの要素が絡んで最終的な表示品質を決定します。開発者やユーザーは用途(競技性・没入感・省電力など)に応じた選択肢(VSYNC on/off、トリプルバッファ、VRR採用、フレームリミッタ)を理解して使い分けることが重要です。

参考文献