特集

NVIDIAのさまざまなディスプレイ垂直同期方式をもう一度整理する

NVIDIAコントロールパネルの垂直同期オプション

 NVIDIAのGeForceはこのところ、ディスプレイの垂直同期方式について多数の機能を追加している。普段あまり気にしているユーザーはいないかもしれないが、垂直同期は3Dゲームをスムーズにプレイするために必須な設定項目だ。どのようなゲームにおいてどの垂直同期方式が最適なのか、この記事ではそれを解説する。

そもそも垂直同期とは

 そもそも垂直同期とは、GPUのフロントバッファとディスプレイのリフレッシュレートを同期させる機能のことだ。GPUもディスプレイも、上から順にピクセル(ドット)を描画していくこと自体はまったく共通なのだが、GPUはディスプレイに直接ピクセルを描けるわけではない。GPUはまずバッファと呼ばれるメモリの上にピクセルを描き、そのデータをディスプレイに転送して、ディスプレイがそれを描く。

 GPUが1秒間にバッファに描けた数は一般的にfps(frame per second、1秒間に描けたフレーム)と呼ばれ、ディスプレイが1秒間に描く速度はリフレッシュレートと呼び、単位で言うとHz(ヘルツ)で表される。

 ここで問題となるのが、GPUの描画能力とディスプレイ描画能力の違いである。例えば一般的なディスプレイの描画速度は60Hzであるが、高性能なGPUで軽い3Dアプリケーションを実行した場合60fps、つまり60Hzを超えられる。例えば60Hzのディスプレイに対し、GPUが70fpsでGPUが描画できたとすると、GPUがバッファに描画している最中の絵をディスプレイに転送することになる。バッファは上のピクセルから順に上書き更新されるので、ディスプレイに出力した段階で、絵の上と下がズレてしまう--いわゆる「テアリング」現象が発生してしまうのだ。

 そこで生まれたのが垂直同期(VSync)という機能だ。垂直同期では、GPUがバッファに描くタイミングを、ディスプレイのリフレッシュレートに合わせる。つまりディスプレイが更新できるタイミングまで、GPUはバッファに描かず待ちの状態に入る。これによって、画面の破綻、つまりテアリングを抑制するわけだ。

垂直同期がオフの場合、ディスプレイのリフレッシュレートに関係なくバッファ内容が出力されるので、フレームレートが高いと中途半端にレンダリングされた結果も出力され、結果テアリング現象になる

垂直同期を取ると、60fpsをちょっとでも割ると次は30Hzしかないという事実

 垂直同期を有効にすると、GPUの描画能力がディスプレイのリフレッシュレートを完全に超えられる場合特に問題はないが、3Dアプリケーションの負荷は一定とは限らない。負荷の軽いシーンと重いシーンが併存する可能性があり、軽いシーンでは60fpsを超えて描画できるが、重いシーンでは60fpsを切ってくる可能性もあり得る話だ。

 ここで問題となるのが重いシーンだ。例えばGPUが45fpsでしか描けず、垂直同期をGPUが待つ場合、60Hzの次は30Hzだからだ。

 「えっ、45fpsなら60Hzのリフレッシュレートに収まっているので45Hzではないのか?」という疑問もあろうが、残念ながら否だ。なぜならばディスプレイの60Hzは固定であり、1回の同期をしそびれたら、次のリフレッシュのタイミングまで待つしかないからだ。時間的見れば、60Hzのディスプレイは初回から次への更新のタイミングが約16.66msだが、その次は2倍の33.32msだ。即ち30Hzである。もしGPUの描画速度が30fpsを切っていたら、次のリフレッシュ待ちは20Hz(3倍)、さらに次は15Hz(4倍)である。

これは理想的な、GPUにとって負荷が軽いゲームの場合。次の画面リフレッシュまでにレンダリングが間に合うので、まったく問題にならない
しかし一時的でもリフレッシュレートに間に合わないと、次のリフレッシュまで待たなければならず、ディスプレイ側の更新が止まり、ゲームエンジンも待つことになる

 実質問題、ゲームにおいて60fpsと20fpsのシーンが混在するとは考えにくいが、少なくとも60fpsが、59fpsになった時点で、垂直同期を待つためリフレッシュレートが30Hzになる。これは仕組み上の制限であり、滑らかな30Hzであればさほど問題にならないのだが、60Hzから30Hzに落ちる際に、ディスプレイは少なくとも1回のフレームを待たなければならず、一瞬ピタッと止まったような現象が起きる。これが「スタッタリング」現象だ。

 そこでNVIDIAはKepler世代=GeForce GTX 600番台で、「Adaptive VSync」(コントロールパネル設定では“適応”)と呼ばれる仕組みを導入した。このAdaptive VSyncは簡単に言えば、描画速度がリフレッシュレートを超える場合は、ディスプレイのリフレッシュレートと同期しテアリング発生を抑える。一方、描画速度がリフレッシュレートを下回る場合はも垂直同期をオフにし、スタッタリング現象を抑えるわけだ。

フレームレートが60fpsを割ると、GPUは次のタイミングまでリフレッシュを待つため、リフレッシュレートは実質30Hzになる。そして上下時に、スタッタリング現象が発生する
Adaptive VSyncではフレームレートが60fpsを割った場合、垂直同期をオフにする。ただしスタッタリングは抑えられるが、ティアリングは回避できない

 ビデオカードメーカーのPalitが、スタッタリング現象とAdaptive VSyncの効果について、分かりやすいビデオを公開しているので、是非観て欲しい。単なる垂直同期がオンの時は、一瞬止まる動きになっているのがすぐ分かるだろう。

Adaptive VSyncは完璧ではないので、G-SYNCが登場する

 しかしこのAdaptive VSyncの仕組みを見れば分かる通り、完璧ではない。Adaptive VSyncはあくまでも60fpsを超えた場合にテアリング、60fps未満の場合にスタッタリングを回避するためのもので、60fps未満ではテアリングを回避できない。

 そこで登場したのがNVIDIAのG-SYNCである。G-SYNCでは、GPUがバッファに描き終わったタイミングで、画面のリフレッシュを行なう。つまりGPUがディスプレイを待つのではなく、ディスプレイがGPUを待つようになったのだ。

 G-SYNCの最大の特徴は、上限リフレッシュレート内であれば「任意のタイミングで画面更新がかけられること」だ。例えば144HzのG-SYNCディスプレイの場合、前のフレームから約6.944ms以上経っていれば、いつでも更新がかけられる。つまり、GPUが完全な画像をバッファに描かれ終えた時点で、ディスプレイが更新を掛ける。G-SYNCの登場で、PCは表示システムとして初めてGPUが主導権を握るようになったわけだ。

G-SYNCは、GPUがバッファを描き終えてから画面をリフレッシュする。初めてのGPU主導型の更新方式だ

 ちなみにG-SYNCは元々、テアリング発生を抑えるために、ディスプレイの対応リフレッシュレート以上に達した場合、垂直同期を取る仕様であったが、ゲーマーの声を反映し、垂直同期をオフにするオプションも後から加わったという。

 ちなみにAMDのFreeSyncも、G-SYNCと同じ考え方と仕組みである。

ゲーマーが垂直同期を嫌うのはレイテンシ

 特にFPS(一人称シューティング)ゲームで、ハードコアなゲーマーは垂直同期を嫌う。これはGPUが高いフレームレートを実現していても、垂直同期をするとゲームエンジンがディスプレイの出力を待たなければならず、それによって遅延が発生する可能性があるからだ。

 もう少し具体的に説明していこう。例えば一般的なFPSゲームの流れはざっくり言って

1.プレイヤーが画面の状況を見て判断し
2.プレイヤーがアクションを起こす
3.ゲームエンジンがそのアクションを処理をする
4.エンジンが処理結果を画面に出力する

 という処理の繰り返しである。至極当然のことだが、プレイヤーが画面を見てから判断を下す以上、画面表示とアクション処理は切り離すべきではない。プレイヤーは、チートでも使わない限り、画面に見えていないところに対して弾を撃ったりできないはずだからだ。

 しかしプレイヤーが本来求めているのは、画面のリフレッシュレートに制限された判定ではない。実世界ではリフレッシュレートなど存在せず、移動は絶えずマップに対して予測で行なわれているし、銃のトリガーを引くのも、リフレッシュレートのタイミングだとは限らない。つまり、本来プレイヤーのアクションは、画面の処理状況に関係なく行なわれるものだ。

 これが、プレイヤーの行動や当たり判定を画面描画とは別の処理(スレッド)で走らせ、後から描画と合成するゲームエンジンでは、大した問題にならないかも知れないが、そうでないゲームエンジンの場合、プレイヤーの行動処理も当然60Hzに制限されることになる。これが、垂直同期がハードコアゲーマーから嫌われる原因だった。特に古いゲームは、GPUがより高いフレームレートを実現できるのにも関わらず、行動判定がマルチスレッド化されておらず、垂直同期をオンにすると遅延が顕著となり、オフにするとテアリングが発生する問題があった。

 そこで登場したのが、PascalのGPUとともに発表された「FAST SYNC」(コントロールパネル設定では“高速”)技術だ。これは言わばゲームエンジンに対し「垂直同期設定はオフ」だと“騙して”、実際には出力側が垂直同期を取るものである。

 具体的な仕組みについては以前の記事も合わせて参照されたいが、FAST SYNCでは3枚のバッファをうまく回す。バッファには、画面出力段の「フロントバッファ」と、現在レンダリングを施している「バックバッファ」の2種類が用意されているのだが、これまでフロントバッファが出力されてから初めてバックバッファがフロントバッファに移動していた(移動というより、内部的にフラグを切り替えるだけだが)のだが、これだとフロントバッファが出力されない限りバックバッファに新たにレンダリングを施せない問題があった。

 そこでFAST SYNCは、レンダリングを終えたバックバッファを「ラストレンダードバッファ」としてフラグを立て、フロントバッファへの出力を待ち、これまでバックバッファだったバッファを、フロントバッファに出力したものとして、新たにレンダリングを受け付けるようにした。これによりゲームエンジンからは絶えず新しいバッファがあるとして認識され、垂直同期を待たずして処理を継続できるようにしたわけだ。

 フロントバッファとラストレンダードバッファ、バックバッファという3枚のバッファを挟んでいるので、垂直同期オフ時ほど低レイテンシというわけではないが、垂直同期オン時よりは明らかに低減できるというのがNVIDIAの説明である。デメリットは、画面出力されない分のフレームまで描画され、それらは捨てられるので、せっかく使ったGPUのリソースが無駄になる点である。

レンダリング部と出力部を分離させ、レンダリングのバッファにフリップロジックを取り入れ、ラストレンダードバッファを用意し、レンダリングを終えたバックバッファがフロントバッファに出力されなくても、ゲームエンジンからは空き(というより更新できる)のバックバッファがあるように“騙し”、処理を継続させる
FAST SYNCは垂直同期オフと比較すると遅延ががあるが、垂直同期オン時よりは大幅に抑えられる

結局のところ、どの設定が良いのか

 さて、これだけ豊富に用意されている垂直同期オプションだが、ゲーマーは一体どの設定を選べば良いのか。

1.負荷が高いゲームはG-SYNCまたはAdaptive VSync

 ベストはG-SYNCディスプレイとの組み合わせである。G-SYNCディスプレイは構造上、負荷が高いゲームではスタッタリング現象が発生しないし、上限のリフレッシュレートに達するまで、いずれのフレームレートでもリフレッシュレートが2分の1、3分の1、4分の1……になることなく、一切リフレッシュレートの制限を受けない。AMD環境の場合、FreeSync対応ディスプレイがオススメである。

 一方ディスプレイに対して投資できない、または投資したくない場合は、Adaptive VSyncを使えば良い。低フレームレート時にテアリングが発生する可能性があるが、スタッタリング現象よりははるかにマシである。

2.負荷が低いゲームにはFAST SYNC

 一方、数年~数十年前と言った、今のGPUには“軽すぎる”ゲームは、FAST SYNCが一番効く。そもそもフレームレートが60fpsに達さないようなゲームは、描画の処理が大半を占め、いずれにしても入力の処理が間に合わないか、そもそもマルチスレッド化されているかだが、フレームレートが200fpsを超えるようなゲームにおいては遅延を最小限に抑えつつテアリングを排除できる。

 もっとも大事なことは、G-SYNCなどとは異なり、ユーザーはドライバの更新だけでこの機能を無償で入手できる点だ。FAST SYNCはMaxwell世代以降であれば、現在最新の372.54を適用すれば利用できる。元々Pascalとともに発表された機能だが、1世代前のMaxwellでも利用できる。

 NVIDIAコントロールパネルでは、ゲームごとのプロファイルが設定できるので、負荷が重いゲームにはAdaptive VSync、軽いゲームにはFAST SYNCを選択することが可能だ。用途やGPUのスペックに合わせて選択して欲しい。

【12時50分訂正】記事初出時、シャッタリングとしておりましたが、正しくはスタッタリングです。お詫びして訂正します。