Vsync(Vertical Synchronizationの略)は、ゲームのビデオ出力をディスプレイのリフレッシュレートに同期させ、画面のティアリングを防ぐために使われます。垂直同期とも言われます。
エミュレータでのVsyncはこれまで問題が多く、オーディオドライバのバッファリングによる遅延の問題や、ゲームがエミュレータと異なるリフレッシュレートで動作することによるスタッタリングが発生していました。
また、オーディオに同期するエミュレータでは、タイミングの不完全さによってオーディオバッファが溢れるまたは枯渇すると、Vsyncのスタッタリングが発生することがあります。
固定フレームレートのエミュレータでVsyncのパフォーマンスを向上させるいくつかの方法を以下に示します。
ティアリング: 1枚の画像の中に複数フレームの画像が描画されてしまい、映像が途中で左右にずれたように見える現象のことです。
スタッタリング: 俗に言う「カクツキ」のことです。映像が途中でカクッカクッと一瞬止まったようになる現象です。
このオーディオ同期方法は、起動時にエミュレートされたシステムのオーディオ入力レートを、ホストシステムの出力レートに合わせて、一定の制限内で調整します。
これにより、ゲームのビデオのリフレッシュレートが現在のディスプレイのリフレッシュレートと同じでなくても、Vsyncはスムーズに動作します。
十分に小さな調整であれば、オーディオのピッチやスピードの違いが目立つことはありませんが、大きな調整では目立ってしまうので、通常はオーディオレートの変化を最大5%までに抑えるようにしています(60Hzのディスプレイであれば、57Hz~63HzのゲームをスムーズにVsyncすることができます)。
調整はエミュレータの起動後には変更されないため、システムのフレームタイミングのわずかなずれがVsyncのスタッタリングを引き起こす可能性があります。
ただし、システムのタイミングを正確に測定することができなければ、多くの場合、この調整は非常に困難または不可能です。
可変フレームレートを使用するエミュレーターではエミュレートされたディスプレイで50FPSまたは60FPSに固定されていない場合、うまく動作しないことがあります。
この方法は、higanやRetroArchで実装されていることが知られています。
この方法は、オーディオ入力レートをオンザフライで再調整し、タイミングの不一致によるオーディオバッファの溢れや枯渇を防ぎ、Vsyncのスムーズな動作を維持します。
調整量はダイナミックレートコントロールデルタによって決定されますが、デフォルトでは人間の耳には聞こえないと思われる0.5%に設定されています。
起動時のSRCと組み合わせることで、極めて正確なシステムのタイミング情報を必要とせずに、エミュレーションをディスプレイにほぼ完全に同期させることができます。
この方法は、nemulatorやRetroArchに実装されていることが知られています。
この方法は、ビデオドライバのVsyncバッファリングに伴うレイテンシを軽減するためのものです。
ベンダは一般的に、ベンチマークでのスコア向上やPCゲームでのパフォーマンス向上のために、ビデオドライバにバッファリングを実装していますが、これはレイテンシに悪影響を及ぼし、特にこのレイテンシを考慮して作られていない古いゲームのエミュレーションには悪影響を及ぼします。
Hard GPU Syncは、OpenGLの拡張機能であるARB_sync
を使って、指定したフレーム数だけバッファリングを行うようにドライバを強制し、レイテンシを改善する可能性があります。
0フレームのバッファリングはパフォーマンスにかなりの負担がかかり、フレームドロップを避けるためにエミュレータを60fpsのフルスピードで動作させるのに必要な速度の何倍もの速度で動作させる必要があります。
1フレーム以上のバッファリングは、パフォーマンスの要求を軽減します。Linux上のDRM/KMSも同様の方法で利用することができますが、ビデオバッファを直接制御することにより、パフォーマンスが大幅に向上します。
この方法は、RetroArchにしか実装されていません。
これらの方式は、Nvidia社とAMD社がそれぞれ開発しているVsyncの代替方式です。
これらに対応した新しいディスプレイが必要で、ゲームがディスプレイに同期するのではなく、ディスプレイがゲームに同期するフレームレートを可変に調整することができます。
MAMEでは、この機能を利用して、アーケードゲームをネイティブのリフレッシュレートで動作させることができ、スタッタリングやオーディオのピッチやスピードの違いもありません。
RetroArchでは、設定でSync to Exact Content Framerate
をオンに設定してSRCとDRCを無効にすると、この機能を利用することができます。(この機能を使用するには、RetroArchでVsyncがオンになっている必要があります)