VSyncWaitについて

多分、普通の人は「VSYNC」っていっても何のことだかサッパリなのではないでしょうか。

つまり、「VSyncWait」という設定項目の意味が分からず、適切な設定ができていないと思います。

ところが実際のところ、この辺りについてちゃんと説明しているサイトを見ることが無くなってしまいました。さすがに、ゲーム作りの学校とかではちゃんと教えているんだと思いますけど、昔はこの辺りの知識はパソコンを使っている人にとってはかなり常識っぽいところがありました。

というわけで、DTXManiaの領分からは外れてしまいますが、少々まじめに説明してみることにします。 (概略レベルですが)

Release 061 での、 CONFIGURATION の VSyncWait と NoSyncSleep。


まず、VSYNCというのは、"Vertical Synchronizing signal" の略で、「垂直同期信号」のことです。 VSyncWaitというのは、これを待つこと、つまり「垂直同期待ち」のことです。

・・・なんのことだか、サッパリ分かりませんよね。(^_^;;;


以下、話の都合上、まずはじめに昔のテレビ (いわゆる「ブラウン管」ってやつ) の描画・動作原理を説明します。 (イマドキの液晶テレビの描画に関わる信号のやりとり方法もほとんど同じなのでご安心を。)
その後で、VSyncWaitの持つ意味について説明します。

ブラウン管を使っているとき、ブラウン管の奥の方(電子銃)から、表示面に対して、1本(*)の細いビームが出ています。このビームがブラウン管の表示面に当たると、その点がビームの色で光ります。
(*) 本当はR,G,Bの3本ビームなんだけど、説明的には気にしない。

(その瞬間、テレビはそのビームに照らされている1点しか光っていません。でも、人間の目はかなりいい加減なもので、残像で画面全体が光っているように見えます。液晶テレビは本当に「画面全体が光っている」んですけどね。描画の書き換えのやり方そのものはまったく同じです。)

そのビームは、まず画面の左上から始まって、そこからシュパッと水平に右の方にワイプされます (水平にひと薙ぎされる)。水平にビームが移動する間、その点(dot)その点の色にビームの色が変わります。もっと詳しく書くと、「その点に表示すべき色をこのときパソコンのVRAMから引っ張ってきて、その色にあったビームを出す」のです。
パソコンでは、「モニタに表示して欲しい画面の色情報」をVRAMというメモリに保存している・・・という作りになってまして、「VRAMに、表示すべき色を書き込む」ことで、その後はパソコン様が自動的にその色の通りに画面表示し続けてくれる、という仕組みになっています。

ここまでで、画面の一番上の、1dot幅・1行分の描画ができました。ここまで終わったら、次に(一旦ビームの出力を止めて)画面左上の1dot下のところにビームの照準を戻します。ここでビームの出力を再びオンにして、同じように1ライン分描画します。

これをず〜っと、画面の一番下まで繰り返します。

一番下まで描画が終わったら、また一番上に戻って、左上から描画を再開します。


この一番最後の、「一番下まで画面の描画が終わってから、一番上に戻って左上から描画を再開するまでの時間」を、垂直帰線期間と呼び、このタイミングを待つことを「垂直同期待ち」と呼びます。

なぜこのタイミングを特別扱いしているかというと、このタイミングで画面の情報を書き換える(VRAMを書き換える)と、テレビに表示されている映像を乱さずに画面を書き換えることができるからです。このように説明すると、大抵の方はここで一つの疑問がおきます。なぜ、「垂直同期を待って画面を書き換えると、映像が乱れない」のでしょうか?

一般的なゲームでは、パソコンのメモリに「画面のイメージ」を作っておいて、適当なタイミングでそれを一気にVRAMにコピーします。これが「VRAMの書き換え」に相当するのですが、このコピーが終わったら、またパソコンのメモリの「画面のイメージ」を作り直して、 VRAMにコピーして、・・・を繰り返します。
# 本当は、「コピー」以外に「フリップ」ということをもやっている場合が多いのですが、原理的な説明からは外れますのでここではその説明を省略します。

このVRAMへのコピーを、垂直帰線期間のタイミングを待たずに行うと、どうなるでしょうか。

例えば、画面の真ん中までビームが来たタイミングで、VRAMをごそっと書き換える (画面のイメージをVRAMにコピーする)とします。そうすると、テレビは「VRAMにその時々に書かれている色情報に合わせてビームを出す」ため、画面の上半分と下半分でまったく違う絵が出てきてしまうことになります。動画のようなコンテンツを表示している場合には「画面が乱れる」ことになりますし、スクロールしているような画面の場合だと、画面が波打つことでしょう。


一般的なパソコンのモニタでは、1秒の間に60回、画面を書き換えます。従って、垂直同期待ちをして画面描画をする設定の場合は、 (パソコンに十分な性能があれば・・・・つまり、十分に速く画面のイメージを作り、それをVRAMにコピーできれば) 1秒の間に60回、画面を書き換えることができます。

VSyncWait = ON というのは、この「垂直同期待ちをして画面描画をする」という設定のことです。

ただし、必ず「垂直帰線期間に同期して」VRAMを書き換えますので、 60回以上書き換えることはできません。

この、「1秒の間に何回画面を書き換えているのか」ということを表現するために、よく FPS (Frames per Second) という単位が用いられます。例えば、先程の「1秒の間に60回、画面を書き換えている」ことを、 60FPS と表現します。

VSyncWait を OFF にするということは、この「垂直同期待ちをしないで、VRAMを書き換える」ということです。つまり、画面書き換えのビームが画面の真ん中にあろうが、そのタイミングでさっさとVRAMを書き換えてしまう、ということです。

つまり、「待たない」分、(パソコンに十分な性能があれば) 60FPS以上の枚数を描画することができます。その代わり、(さっきの説明にあったように) 画面の表示が乱れたり波打ったりしてしまうことがあります。


非力なパソコンを使っている場合は、「画面のイメージを作ったり、 VRAMへのコピーをしたりするのに、1/60秒以上の時間がかかってしまう」ことがあります。こういった場合は、1画面を描くのに

  • VSyncWait=OFF: 1/60秒+ほんの微妙な時間
  • VSyncWait=ON: 2/60秒 (次の垂直同期タイミングを待つので、こうなる)

かかります。つまり、VSyncWait=ON の場合は 30FPSになり、一気に描画枚数が半分になります。

60FPSと30FPSの違いは体感出来るくらい大きく、非常にスクロールがガタガタして見えると思います。なので、非力なパソコンを使っている場合は、VSyncWaitは絶対にOFFにすべきです。

逆に、十分に強力なパソコンを使っている場合は、VSyncWaitをONにしても大丈夫ですが、突発的に描画以外のところにCPUパワーを取られてしまったりすると、そのタイミングでスクロールががたつきます。ですから、この場合もVSyncWaitをOFFにしておいた方が無難です。

まとめると、パソコンが非力か強力かに関わらず、「画面の乱れ/波打ち」を許容出来るならVSyncWaitはOFFにしておけ、ってことです。どれくらい画面が乱れたり波打ったりするかは、一度自分でVSyncWaitの設定をオフにして、自分の目で確認してみて下さい。
# 実際、ほとんど分からないと思います。VSyncWaitのONとOFFを両方比べてみて初めて、「ONの方が綺麗にスクロールしている」のが分かる程度だと思います。


さて、VSyncWaitをOFFにしている場合、ここまでの説明では「画面のイメージが完成したら即」VRAMにコピーしているように書いていましたが、実際にはそうすると、パソコンの種類によっては問題が出ることがあるため、 DTXManiaでは「ほんのちょっとだけ待ってから」VRAMにコピーしています。

この「ほんのちょっとの時間」を設定するのが、NoSyncSleep で、この NoSyncSleep の値が、そのままmsec単位の待ち時間になります。

初期状態では NoSyncSleep=4 になっていますが、これはFROMさんのパソコンで画面描画とCPU負荷のバランスを取った設定になっています (CPUが3GHzくらいで、GPUがRADEON9800だったと思います)。なので、各自画面の乱れ具合とCPU負荷, 入力感度などをみながらこの値を調整する必要があります。

(注: DTXManiaGR Release 068以降では、NoSyncSleep の指定はなくなりました。この値は、DTXMania(というかDirectX9)内部で自動調整されます。)


ここまでで、VSyncWait と NoSyncSleep の意味がだいたい理解できたかと思います。

VSyncWaitのON/OFFに依らず、入力の精度は同じです。ですから、VSyncWaitのON/OFFは、好みで選んでいただいて結構です。個人的には、スクロール速度を速く設定する人にとっては、VSyncWaitをOFFにしていただいて、描画の枚数を60FPSより大きくしたほうがいいと思います。ですが、そうでなければ、VSyncWaitをONにして、(比較的低速度のスクロール速度で)スクロールを滑らかにして、かつ(描画枚数を減らすことで)システム負荷を小さくしたほうがいいのではないかなと思います。

(以下は、2005年頃の搭載機能に基づく記載ですので、無視してください)

==ここまでの説明を踏まえて、最後にものすごく大事なことを書きます。DTXManiaでは、「画面を1回書き換える毎に、パッドやキーボード、 DTXPRESSなどからの入力を1回受け付ける」という作りになっています。つまり、60FPSの性能を持つパソコンの場合は1秒間に60回入力を受け付けてくれます (つまり16ms単位で入力判定してくれる) が、例えば1FPSなんていうパソコンの場合は、1秒間に1回しか入力を受け付けてくれません。書くまでもありませんが、これではとても曲に合わせてドラムを叩くことはできません。

ですから、「ドラムの感度を上げたければ、VSyncWaitはOFFにし、 DTXMania068より前のバージョンであれば NoSyncSleepに小さめの値を設定すべき」なのです。

これはキーボード・専コンを問わず同じです。「USB経由の専コンだとどうも感度が鈍い」という場合、とりあえずVSyncWaitをOFFに、NoSyncSleepを1にしてみてください。これでDTXMania側の入力感度は最高になります。これでもまだ感度が鈍いようなら、残念ながらUSBアダプタの方の性能がついてきていない、ということで、 NoSyncSleepの値を増やしながら感度を確認していくことになるかと思います。==

最終更新: 2016.6.13

DTXMania Q&A