とある記事を読んでいたら微妙に間違っていると思ったので、V-Syncの話を書いていこうかと。
そもそも垂直同期ってなんやねん、って思う人のほうが多いと思うのでそこから。
そもそも垂直同期ってなんやねん、って思う人のほうが多いと思うのでそこから。
今は昔、
薄型テレビが登場する前の時代に
ブラウン管という巨大なテレビが主流だった時代があります。
ブラウン管は割と単純な構造のディスプレイ装置で、
特殊な粒子が当たると赤緑青に発光するガラス面に
電気を使って粒子を当てることで映像を写していました。
画面に向かって左上の方から右上に向けて粒子を当て
右端にいったら、一段下げてまた左から右へ。
これを画面の縦のラインの分を繰り返したら、
再度最上部左上から粒子を当てて行く、というのの繰り返し。
人間の目には粒子があたって発光している部分の残像が見えており
1秒間にこの粒子ビームの移動が超高速で行われるため
1枚の映像に見えるという仕組み。
古い映画なんかで、秒間24コマくらいのカメラで撮影した
テレビの映像なんかには良く黒い帯が入ってたのを
年配の人なら覚えてると思うんですが、
その黒い帯は人間の目には残像が残っている部分も
ビデオカメラのような
その瞬間瞬間の光を捉える装置を使うと粒子が光って
残像すら残らない場所に黒い帯が写っているという仕組みです。
最近のテレビは液晶テレビに置き換わっていて、
全ドットが常時発光している事が多いため
ビデオカメラで撮影しても
黒い帯が表示されることは稀です。
そして、垂直同期の話に戻ります。
この粒子を発射するビームが
特定の周期で画面向かって一番左上に戻るんですよね。
そのタイミングで映像を更新してやることで
「ティアリングが発生しない」
という状態になるわけです。
ティアリングがわからない人はウィキペディアでも読んでみてください。
画面の描画中に、別の画像を描画すると
画面には途中で別なものに置き換わった奇妙な画像に変わってしまうんです。
例えば画面全体にAと表示されている状態から
垂直同期を取らずにBの表示をさせようとすると
画面の上半分にAの上半分が表示され、下半分にBの下半分が表示される。
これがティアリングという状態です。
近年のディスプレイ装置には液晶が採用されているので
このティアリングと無縁そうですが、
実際には画面に映像を表示するためのコントローラーがあり、
そのコントローラーに送られてくる映像バッファの内容次第では
画面の上半分にA、下半分にBが表示されるような状況になりえます。
そのため、ティアリングを発生させないように、
「垂直同期」システムは現在の液晶ディスプレイ装置でも残っており
そのタイミングでディスプレイ装置の映像バッファを更新してやることで
ティアリングが発生しないという理屈なのです。
ちなみにこの垂直同期に描画が間に合わない場合は
フレームドロップという状態になり、
最悪の場合は1秒間の描画フレーム数の低下に繋がります。
ただし、描画が間に合わないとは言っても、
垂直同期を取っている場合は、1フレーム送れて描画されるだけで
実フレーム数に影響が出るのは描画の更新頻度が
1フレーム以上に伸びた場合のみなんですよね。
60fpsの場合で説明されてたので60fpsで例を出します。
60fpsだと画面の更新には16.6ms(ms=ミリ秒)以内に描画行う必要がある。
そして、垂直同期に毎回0.1ms遅れたとする。
この場合は画面の更新が実際の描画時より1フレーム遅れるだけで
フレームレート自体は60fpsから落ちることはありません。
それじゃあ60fpsを下回る事になる状態とは?
1フレームの描画の速度が16.6msの倍以上かかってしまっていた場合です。
垂直同期よりも0.1ms毎回遅れているだけなら、
描画のタイミングが1フレーム後ろにずれ込むだけですが、
垂直同期のタイミングが33msなど必要になってしまった場合は、
その瞬間だけ、1フレーム分の描画を実画面では2フレーム表示させるんですよね。
なので、そういう状態が連続して続いた場合はフレームレートが30fpsなどに低下します。
ゲームをプレイしていて、
大抵の場合は60fpsに固定されているけど
描画負荷の大きな場面で一時的に40fpsなどに下がってしまっている
なんて事を経験された人もいると思います。
そのような時は、垂直同期のタイミングに画面描画用のデータが
大幅に遅れて届いてしまったために
フレームドロップが発生しているというお話ですね。
垂直同期のタイミングより毎回きっちり0.1ms遅れて更新している場合は、
描画が1フレーム遅れるだけで
フレームレートが60fpsから落ちることはありません。
垂直同期とはそういうものです。
なんか書いてて思ったけど、0.1ms遅れた時にフレームドロップすると書くよりも
「毎回描画に30msくらいかかってしまっている時にフレームレートが落ちる」
と書いたほうがわかりやすい気がした。
バッファを更新したら、遊び(余裕)のある時間に次の画面の描画を行ってるはずなんで
毎回きっちり0.1ms遅れる状態になっても垂直同期には影響しないはずなんですよね。
これ、ドライバレベルでやってるお話なんで、普段あまり意識していないと思いますが、
いわゆるダブルバッファってやつなんですよ。
昔のPCなんかは非力なんで、ハードウェアで実装されている
ダブルバッファを活用してティアリングが発生しないようにしていたんです。
グラフィック用のメモリ、いわゆるVRAMには画面に表示するためのデータ領域が
常に2つ用意されていて、片方に描画中はもう片方を表示するってやるんです。
垂直同期のシステムはこの方法でティアリングが発生しないようにしています。
シングルバッファだとリアルタイムに描画中の映像が表示されるんで
割とカオスなことになると思います。
トリプルバッファという言葉は耳にしたことが多いと思います。
これはダブルバッファが2枚の描画エリアを交互に描画と表示で切り替えるのに対して
描画用エリアを2枚、表示エリアを1枚にすることで
なめらかな画面描画を提供するシステムです。
その代わり、トレードオフでレイテンシ(遅延)が出てしまいます。
実際のゲーム中の入力などに対して、
実際に画面に描画されるデータは約2フレーム後の話になるわけですから。
垂直同期をオフにすると、
画面の更新のタイミングに関係なく
グラボのパワーのゆるす限り画面の描画行うため
ティアリングはもちろん、スタッタリングなんかも発生する可能性があります。
ティアリングはディスプレイ装置が、
実映像描画中に別の映像データが送られることで発生する現象です。
スタッタリングはグラボから映像データが遅れて到着することで
描画の遅延が発生し、その結果、一瞬だけ同じ画面が連続表示されるために
カクついて見える現象のことです。
このスタッタリング頻繁に発生する状態になると
60fpsモニタ、60fps対応ゲームであるにも関わらず
30fpsでの描画・・・酷いときには30fps以下に落ちたりします。
まあ、スタッタリングが発生するのは
PC側のパワー不足によるものが大きいです。
十分なパワーのあるPCでもドライバやプログラムなどが
調整不足で発生することもありますが、
近年では十分なパワーの有るPCでのスタッタリングが発生するのは稀ですね。
WindowsXPあたりの頃は
メモリリークなどが原因で、スタッタリングを起こすことは良くありました。
最近のnvidiaのコントロールパネルには
垂直同期オン・オフ設定以外にも
高速、適応、適応(ハーフ)も追加されてますね。
高速は垂直同期オフとほぼ同じ挙動でグラボが動作します。
ただしモニタに送られる映像データは垂直同期のタイミングにあったものだけで、
それ以外の描画された映像は破棄され、
実際のディスプレイ装置に描画されることはありません。
適応は垂直同期オンに近い動き方をしますが、
結構内部的には違う動き方をします。
垂直同期オンの場合は、
前回の画面の更新(垂直同期タイミング)に間に合わなかった映像は
グラボ内にバッファされた状態にあり、
次回の画面の更新時にその画像を描画します。
しかし、適応を使う場合はレイテンシを優先するため
フレーム遅延を避けるように描画を行います。
つまり・・・
先に書いた垂直同期の説明で
「毎回0.1ms遅れて描画されると60fpsの映像が30fpsになってしまう」
ということも十分に出てくる可能性がある話になってくるんですよね。
垂直同期の説明をしているサイトでちょっと違うかなと思った理由はこれです。
垂直同期「オン」の説明が、「適応」の説明になっちゃってるんです。
そして適応に設定している場合は、垂直同期のときと違って
同期タイミングが合わなかった場合は、垂直同期を切って
画面の描画更新を行うというのが大きく違う点です。
そのため、ティアリングが発生します。
毎回16.6ms以内に更新が完了していて、同期をとっていても
特定フレームで描画に16.7ms以上かかってしまった場合、
そのフレームに関しては垂直同期を取らずに画面の描画を行い、
その結果、文字Aを描画中にBのデータが送られてきて
AとBの合成画像(ティアリング状態)になる、という仕組み。
レイテンシ優先たのめの措置、設定項目なので
入力遅延、描画遅延を発生させたくない人向け。
適応(ハーフ)は
垂直同期のタイミングをモニタのリフレッシュレートの半分に抑え
ティアリングを発生しにくくする設定です。
動作の仕方は適応と同じですが、
画面のリフレッシュレートは半分に固定。
そして、リフレッシュレート半分にしてもまだ描画遅延が起こる場合は
同様にティアリングが発生してしまいます。
※ちょっと追記
どうせならそれぞれの設定を必要とする人を付け加えておく。
基本的には垂直同期は「アプリケーションの設定を利用する」でOK。
垂直同期オフは色々な意味お勧めしない。
グラボでの描画を全力で行うため、グラボにかかる負荷が高いです。
ゲームによっては垂直同期でゲームの動作タイミングを取ったりするので
ゲームが超高速で動作したりする弊害も出てきます。
60fpsで動作する事だけを想定して作ったゲームが垂直同期に合わせて
ゲームの動作速度のタイミングを取ったりしていて
そんなゲームが120fpsで描画できるモニタ環境で
垂直同期のタイミングで動作させると
1秒間に2秒分(60フレームの2倍の120フレーム描画を行ってしまう)の動作をする。
というわけで、垂直同期オフは色々弊害が発生するリスクが高いです。
垂直同期オンは基本的にオンにするのがゲーム側のデフォ設定だが、
極稀に古いゲームが垂直同期の設定そのものがゲームに無いものがあります。
自分の知ってる中だとPC版ラストレムナント。
グラボで垂直同期を強制ONにしないとティアリングがひどかった。
描画自体は60フレームみたいなんだけどね、
垂直同期を取って無いようでティアリングしまくってた。
アプリケーションが基本的に垂直同期オンにしてくれることが多いので
基本はこの垂直同期オンが使われる。
高速は描画フレーム数を稼ぎつつ、ティアリングを発生させたくない人が使うと良い設定。
FPSガチ勢なんかは240fpsで描画させたいなんて人も結構いるハズ。
しかし実際のところ240fpsで描画されることは少ない事もあるわけで。
そんな時にこの高速にしておけば、グラボの許す限りの高速描画を実現しつつ
ティアリングやスタッタリングが発生しない状態も実現してくれる設定です。
適応はフレームの描画遅延を発生させたくない人向け。
ただし、描画が追いついてないフレームが出たりするとティアリングが発生する。
多少遅れてでも描画されたら即時モニタに反映させて、
ティアリングが起こったとしても遅延を可能な限りなくす設定です。
格ゲーみたいな「1フレームの描画の遅れがゲームの勝敗を分ける」みたいな
そんなゲームをプレイしている人向けの設定ですね。
適応(ハーフ)は描画遅延は可能な限りなくしたいけど、
ティアリングもできれば発生させたくない人向けの設定。
しかし30fpsまで下がってしまうと遅延なしでは語れないレベルなんで
モニタ自体がもともと120ヘルツ以上のモニタを使用している前提のお話ですね。
80フレームとか90フレームの描画はできるけど120に届かない。
でも適応でプレイしていると遅延はなくなるがティアリングが出てしまう。
そんな人が60fpsでも良いからティアリングをなくしたい、みたいな時に有効な設定。
なお、ガチでティアリングやスタッタリングを無くしながら
高フレームレートの描画を行いたい場合は
G-SyncやFreeSync対応モニタとグラボを買いましょう(*´∇`*)
薄型テレビが登場する前の時代に
ブラウン管という巨大なテレビが主流だった時代があります。
ブラウン管は割と単純な構造のディスプレイ装置で、
特殊な粒子が当たると赤緑青に発光するガラス面に
電気を使って粒子を当てることで映像を写していました。
画面に向かって左上の方から右上に向けて粒子を当て
右端にいったら、一段下げてまた左から右へ。
これを画面の縦のラインの分を繰り返したら、
再度最上部左上から粒子を当てて行く、というのの繰り返し。
人間の目には粒子があたって発光している部分の残像が見えており
1秒間にこの粒子ビームの移動が超高速で行われるため
1枚の映像に見えるという仕組み。
古い映画なんかで、秒間24コマくらいのカメラで撮影した
テレビの映像なんかには良く黒い帯が入ってたのを
年配の人なら覚えてると思うんですが、
その黒い帯は人間の目には残像が残っている部分も
ビデオカメラのような
その瞬間瞬間の光を捉える装置を使うと粒子が光って
残像すら残らない場所に黒い帯が写っているという仕組みです。
最近のテレビは液晶テレビに置き換わっていて、
全ドットが常時発光している事が多いため
ビデオカメラで撮影しても
黒い帯が表示されることは稀です。
そして、垂直同期の話に戻ります。
この粒子を発射するビームが
特定の周期で画面向かって一番左上に戻るんですよね。
そのタイミングで映像を更新してやることで
「ティアリングが発生しない」
という状態になるわけです。
ティアリングがわからない人はウィキペディアでも読んでみてください。
画面の描画中に、別の画像を描画すると
画面には途中で別なものに置き換わった奇妙な画像に変わってしまうんです。
例えば画面全体にAと表示されている状態から
垂直同期を取らずにBの表示をさせようとすると
画面の上半分にAの上半分が表示され、下半分にBの下半分が表示される。
これがティアリングという状態です。
近年のディスプレイ装置には液晶が採用されているので
このティアリングと無縁そうですが、
実際には画面に映像を表示するためのコントローラーがあり、
そのコントローラーに送られてくる映像バッファの内容次第では
画面の上半分にA、下半分にBが表示されるような状況になりえます。
そのため、ティアリングを発生させないように、
「垂直同期」システムは現在の液晶ディスプレイ装置でも残っており
そのタイミングでディスプレイ装置の映像バッファを更新してやることで
ティアリングが発生しないという理屈なのです。
ちなみにこの垂直同期に描画が間に合わない場合は
フレームドロップという状態になり、
最悪の場合は1秒間の描画フレーム数の低下に繋がります。
ただし、描画が間に合わないとは言っても、
垂直同期を取っている場合は、1フレーム送れて描画されるだけで
実フレーム数に影響が出るのは描画の更新頻度が
1フレーム以上に伸びた場合のみなんですよね。
60fpsの場合で説明されてたので60fpsで例を出します。
60fpsだと画面の更新には16.6ms(ms=ミリ秒)以内に描画行う必要がある。
そして、垂直同期に毎回0.1ms遅れたとする。
この場合は画面の更新が実際の描画時より1フレーム遅れるだけで
フレームレート自体は60fpsから落ちることはありません。
それじゃあ60fpsを下回る事になる状態とは?
1フレームの描画の速度が16.6msの倍以上かかってしまっていた場合です。
垂直同期よりも0.1ms毎回遅れているだけなら、
描画のタイミングが1フレーム後ろにずれ込むだけですが、
垂直同期のタイミングが33msなど必要になってしまった場合は、
その瞬間だけ、1フレーム分の描画を実画面では2フレーム表示させるんですよね。
なので、そういう状態が連続して続いた場合はフレームレートが30fpsなどに低下します。
ゲームをプレイしていて、
大抵の場合は60fpsに固定されているけど
描画負荷の大きな場面で一時的に40fpsなどに下がってしまっている
なんて事を経験された人もいると思います。
そのような時は、垂直同期のタイミングに画面描画用のデータが
大幅に遅れて届いてしまったために
フレームドロップが発生しているというお話ですね。
垂直同期のタイミングより毎回きっちり0.1ms遅れて更新している場合は、
描画が1フレーム遅れるだけで
フレームレートが60fpsから落ちることはありません。
垂直同期とはそういうものです。
なんか書いてて思ったけど、0.1ms遅れた時にフレームドロップすると書くよりも
「毎回描画に30msくらいかかってしまっている時にフレームレートが落ちる」
と書いたほうがわかりやすい気がした。
バッファを更新したら、遊び(余裕)のある時間に次の画面の描画を行ってるはずなんで
毎回きっちり0.1ms遅れる状態になっても垂直同期には影響しないはずなんですよね。
これ、ドライバレベルでやってるお話なんで、普段あまり意識していないと思いますが、
いわゆるダブルバッファってやつなんですよ。
昔のPCなんかは非力なんで、ハードウェアで実装されている
ダブルバッファを活用してティアリングが発生しないようにしていたんです。
グラフィック用のメモリ、いわゆるVRAMには画面に表示するためのデータ領域が
常に2つ用意されていて、片方に描画中はもう片方を表示するってやるんです。
垂直同期のシステムはこの方法でティアリングが発生しないようにしています。
シングルバッファだとリアルタイムに描画中の映像が表示されるんで
割とカオスなことになると思います。
トリプルバッファという言葉は耳にしたことが多いと思います。
これはダブルバッファが2枚の描画エリアを交互に描画と表示で切り替えるのに対して
描画用エリアを2枚、表示エリアを1枚にすることで
なめらかな画面描画を提供するシステムです。
その代わり、トレードオフでレイテンシ(遅延)が出てしまいます。
実際のゲーム中の入力などに対して、
実際に画面に描画されるデータは約2フレーム後の話になるわけですから。
垂直同期をオフにすると、
画面の更新のタイミングに関係なく
グラボのパワーのゆるす限り画面の描画行うため
ティアリングはもちろん、スタッタリングなんかも発生する可能性があります。
ティアリングはディスプレイ装置が、
実映像描画中に別の映像データが送られることで発生する現象です。
スタッタリングはグラボから映像データが遅れて到着することで
描画の遅延が発生し、その結果、一瞬だけ同じ画面が連続表示されるために
カクついて見える現象のことです。
このスタッタリング頻繁に発生する状態になると
60fpsモニタ、60fps対応ゲームであるにも関わらず
30fpsでの描画・・・酷いときには30fps以下に落ちたりします。
まあ、スタッタリングが発生するのは
PC側のパワー不足によるものが大きいです。
十分なパワーのあるPCでもドライバやプログラムなどが
調整不足で発生することもありますが、
近年では十分なパワーの有るPCでのスタッタリングが発生するのは稀ですね。
WindowsXPあたりの頃は
メモリリークなどが原因で、スタッタリングを起こすことは良くありました。
最近のnvidiaのコントロールパネルには
垂直同期オン・オフ設定以外にも
高速、適応、適応(ハーフ)も追加されてますね。
高速は垂直同期オフとほぼ同じ挙動でグラボが動作します。
ただしモニタに送られる映像データは垂直同期のタイミングにあったものだけで、
それ以外の描画された映像は破棄され、
実際のディスプレイ装置に描画されることはありません。
適応は垂直同期オンに近い動き方をしますが、
結構内部的には違う動き方をします。
垂直同期オンの場合は、
前回の画面の更新(垂直同期タイミング)に間に合わなかった映像は
グラボ内にバッファされた状態にあり、
次回の画面の更新時にその画像を描画します。
しかし、適応を使う場合はレイテンシを優先するため
フレーム遅延を避けるように描画を行います。
つまり・・・
先に書いた垂直同期の説明で
「毎回0.1ms遅れて描画されると60fpsの映像が30fpsになってしまう」
ということも十分に出てくる可能性がある話になってくるんですよね。
垂直同期の説明をしているサイトでちょっと違うかなと思った理由はこれです。
垂直同期「オン」の説明が、「適応」の説明になっちゃってるんです。
そして適応に設定している場合は、垂直同期のときと違って
同期タイミングが合わなかった場合は、垂直同期を切って
画面の描画更新を行うというのが大きく違う点です。
そのため、ティアリングが発生します。
毎回16.6ms以内に更新が完了していて、同期をとっていても
特定フレームで描画に16.7ms以上かかってしまった場合、
そのフレームに関しては垂直同期を取らずに画面の描画を行い、
その結果、文字Aを描画中にBのデータが送られてきて
AとBの合成画像(ティアリング状態)になる、という仕組み。
レイテンシ優先たのめの措置、設定項目なので
入力遅延、描画遅延を発生させたくない人向け。
適応(ハーフ)は
垂直同期のタイミングをモニタのリフレッシュレートの半分に抑え
ティアリングを発生しにくくする設定です。
動作の仕方は適応と同じですが、
画面のリフレッシュレートは半分に固定。
そして、リフレッシュレート半分にしてもまだ描画遅延が起こる場合は
同様にティアリングが発生してしまいます。
※ちょっと追記
どうせならそれぞれの設定を必要とする人を付け加えておく。
基本的には垂直同期は「アプリケーションの設定を利用する」でOK。
垂直同期オフは色々な意味お勧めしない。
グラボでの描画を全力で行うため、グラボにかかる負荷が高いです。
ゲームによっては垂直同期でゲームの動作タイミングを取ったりするので
ゲームが超高速で動作したりする弊害も出てきます。
60fpsで動作する事だけを想定して作ったゲームが垂直同期に合わせて
ゲームの動作速度のタイミングを取ったりしていて
そんなゲームが120fpsで描画できるモニタ環境で
垂直同期のタイミングで動作させると
1秒間に2秒分(60フレームの2倍の120フレーム描画を行ってしまう)の動作をする。
というわけで、垂直同期オフは色々弊害が発生するリスクが高いです。
垂直同期オンは基本的にオンにするのがゲーム側のデフォ設定だが、
極稀に古いゲームが垂直同期の設定そのものがゲームに無いものがあります。
自分の知ってる中だとPC版ラストレムナント。
グラボで垂直同期を強制ONにしないとティアリングがひどかった。
描画自体は60フレームみたいなんだけどね、
垂直同期を取って無いようでティアリングしまくってた。
アプリケーションが基本的に垂直同期オンにしてくれることが多いので
基本はこの垂直同期オンが使われる。
高速は描画フレーム数を稼ぎつつ、ティアリングを発生させたくない人が使うと良い設定。
FPSガチ勢なんかは240fpsで描画させたいなんて人も結構いるハズ。
しかし実際のところ240fpsで描画されることは少ない事もあるわけで。
そんな時にこの高速にしておけば、グラボの許す限りの高速描画を実現しつつ
ティアリングやスタッタリングが発生しない状態も実現してくれる設定です。
適応はフレームの描画遅延を発生させたくない人向け。
ただし、描画が追いついてないフレームが出たりするとティアリングが発生する。
多少遅れてでも描画されたら即時モニタに反映させて、
ティアリングが起こったとしても遅延を可能な限りなくす設定です。
格ゲーみたいな「1フレームの描画の遅れがゲームの勝敗を分ける」みたいな
そんなゲームをプレイしている人向けの設定ですね。
適応(ハーフ)は描画遅延は可能な限りなくしたいけど、
ティアリングもできれば発生させたくない人向けの設定。
しかし30fpsまで下がってしまうと遅延なしでは語れないレベルなんで
モニタ自体がもともと120ヘルツ以上のモニタを使用している前提のお話ですね。
80フレームとか90フレームの描画はできるけど120に届かない。
でも適応でプレイしていると遅延はなくなるがティアリングが出てしまう。
そんな人が60fpsでも良いからティアリングをなくしたい、みたいな時に有効な設定。
なお、ガチでティアリングやスタッタリングを無くしながら
高フレームレートの描画を行いたい場合は
G-SyncやFreeSync対応モニタとグラボを買いましょう(*´∇`*)