回答:
GPUが画面に新しいフレームを表示すると、「スキャンアウト」と呼ばれるプロセスで、HDMIケーブル(または任意の種類)を介して画像を転送します。ピクセルは、通常左から右、上から下の順に並んで送信されます。これを行うには、更新間隔のほとんどの期間がかかるように、プロセスのタイミングが取られます。たとえば、60Hzでは、1フレームは約17ミリ秒です。各スキャンアウトにはおそらく15〜16ミリ秒かかり、その間には1〜2ミリ秒のvblankがあります(正確な値はディスプレイとビデオモードによって異なります)。
従来、レンダリングはダブルバッファリングです。つまり、GPUメモリに2つのバッファが格納されています。1つは現在スキャンされているバッファ(「フロントバッファ」)、もう1つはレンダリングされているバッファ(「バックバッファ」)です。各フレーム、2つは交換されます。GPUは、スキャンされているのと同じバッファーにレンダリングすることはありません。これにより、不完全なフレームの一部を見ることによるアーティファクトが防止されます。ただし、これは、各フレームがスキャンアウトを開始する前に数ミリ秒間バッファ内にとどまることがあるため、遅延の増加につながります。
VRは遅延に非常に敏感なので、これは望ましくありません。別のアプローチは、フロントバッファに直接レンダリングすることですが、スキャンアウトが到着する少し前に画像の各行をレンダリングするように、非常に慎重にタイムアウトします。これは「スキャンラインレース」または「ビームのレーシング」(CRTの昔を思い起こさせる「ビーム」)と呼ばれます。これは多かれ少なかれ、スキャンラインの順序、つまりピクセルがスキャンアウトされるのと同じ順序で画像をレンダリングする必要があります。文字通り一度に1行ずつレンダリングする必要はありません。数ピクセルの高さの細いストリップでレンダリングすることもできますが、既に戻っているピクセルを編集することはできないため、順番に行う必要があります。スキャンアウトされました。
このアプローチには多くの欠点があります。非常に厳しいパフォーマンス要件があり、vsyncに対して非常に慎重に時間を調整する必要があり、レンダリングプロセスが大幅に複雑になります。しかし、原理的にはレイテンシーをミリ秒単位で削ることができるため、VRの人々はそれに興味を持っています。
すばらしいのは、スキャンラインごとのクエリにアクセスすることなく、最終的にスキャンラインの正確なラスタ精度を予測できることです。
https://www.youtube.com/watch?v=OZ7Loh830Ec
ティアラインの位置を予測するために、VSYNCオフセットとして正確なマイクロ秒精度の式を考え出しました。VSYNC OFFの間のティアラインは常にラスターと完全に一致するため、VSYNC OFFのバッファスワップを繰り返し行うことで、ストリップレベルの「シミュレートされたフロントバッファレンダリング」中に見えないようにすることができます。
フォーラムスレッドに注意してください-継続的に追加されるオープンソースコードがいくつかあります-https://forums.blurbusters.com/viewtopic.php?f =10 &p = 32002