「スキャンラインレーシング」とは


13

VRに取り組んでいる多くの人々がスキャンラインレースについて話しているのを聞いたことがありますが、それはモーションからフォトンのレイテンシを改善するのに役立つはずです。ただし、OpenGLでこれをどのように行うことができるかは明確ではありません。スキャンラインレーシングがどのように機能し、最新のGPUにどのように実装できるかを説明してください。

回答:


14

GPUが画面に新しいフレームを表示すると、「スキャンアウト」と呼ばれるプロセスで、HDMIケーブル(または任意の種類)を介して画像を転送します。ピクセルは、通常左から右、上から下の順に並んで送信されます。これを行うには、更新間隔のほとんどの期間がかかるように、プロセスのタイミングが取られます。たとえば、60Hzでは、1フレームは約17ミリ秒です。各スキャンアウトにはおそらく15〜16ミリ秒かかり、その間には1〜2ミリ秒のvblankがあります(正確な値はディスプレイとビデオモードによって異なります)。

従来、レンダリングはダブルバッファリングです。つまり、GPUメモリに2つのバッファが格納されています。1つは現在スキャンされているバッファ(「フロントバッファ」)、もう1つはレンダリングされているバッファ(「バックバッファ」)です。各フレーム、2つは交換されます。GPUは、スキャンされているのと同じバッファーにレンダリングすることはありません。これにより、不完全なフレームの一部を見ることによるアーティファクトが防止されます。ただし、これは、各フレームがスキャンアウトを開始する前に数ミリ秒間バッファ内にとどまることがあるため、遅延の増加につながります。

VRは遅延に非常に敏感なので、これは望ましくありません。別のアプローチは、フロントバッファに直接レンダリングすることですが、スキャンアウトが到着する少し前に画像の各行をレンダリングするように、非常に慎重にタイムアウトします。これは「スキャンラインレース」または「ビームのレーシング」(CRTの昔を思い起こさせる「ビーム」)と呼ばれます。これは多かれ少なかれ、スキャンラインの順序、つまりピクセルがスキャンアウトされるのと同じ順序で画像をレンダリングする必要があります。文字通り一度に1行ずつレンダリングする必要はありません。数ピクセルの高さの細いストリップでレンダリングすることもできますが、既に戻っているピクセルを編集することはできないため、順番に行う必要があります。スキャンアウトされました。

このアプローチには多くの欠点があります。非常に厳しいパフォーマンス要件があり、vsyncに対して非常に慎重に時間を調整する必要があり、レンダリングプロセスが大幅に複雑になります。しかし、原理的にはレイテンシーをミリ秒単位で削ることができるため、VRの人々はそれに興味を持っています。


1
私の質問は、最新のGPUでこれをどのように行うのですか?スキャンアウトをクエリする方法はないと思うので、スキャンラインごとの描画呼び出しを実際に送信できないようです。たとえできたとしても、スキャンアウトの前にドローがそこに到達するという保証はありますか?
こしゃ

1
@Mokosha正しい、スキャンアウトを直接クエリする方法はありません。せいぜい、vsyncが(あるOS信号を介して)いつ発生するかを把握し、それに関連するタイミングで(ビデオモードの詳細を知ることで)スキャンアウトの場所を推定できます。レンダリングの場合、glFlushからレンダリングが完了するまでに通常かかる時間を調べて、それに基づいていくつかの推測を行うことができます。最終的には、エラーが発生した場合(たとえば、スキャンアウトの2〜3ミリ秒前に)にタイミングのゆるみを作り、たまにアーティファクトが発生する可能性があることを受け入れる必要があります。
ネイサンリード

待機時間の増加の影響はvsyncによるものであり、これによりフロントバッファーとバックバッファーのスワップがモニターのvblankと同期します。ダブルバッファリング自体はこの問題を引き起こしません。また、ピクセルはフロントバッファで一度しか変更できないため、ちらつきを最小限に抑えるのに役立ちます。
モーリスラヴォー

スキャンラインクエリなしでラスターを予測する正確な方法を思いつきました。以下の回答をご覧ください。
マークレジョン

0

すばらしいのは、スキャンラインごとのクエリにアクセスすることなく、最終的にスキャンラインの正確なラスタ精度を予測できることです。

https://www.youtube.com/watch?v=OZ7Loh830Ec

ティアラインの位置を予測するために、VSYNCオフセットとして正確なマイクロ秒精度の式を考え出しました。VSYNC OFFの間のティアラインは常にラスターと完全に一致するため、VSYNC OFFのバッファスワップを繰り返し行うことで、ストリップレベルの「シミュレートされたフロントバッファレンダリング」中に見えないようにすることができます。

フォーラムスレッドに注意してください-継続的に追加されるオープンソースコードがいくつかあります-https://forums.blurbusters.com/viewtopic.php?f =10 &p = 32002


0

興味のある場合、Dreamcastには「レーシングビーム」レンダリングモードがあり、比較的少ないメモリをフレームバッファーピクセル(たとえば64スキャンライン)専用にすることができ、32行を順番にレンダリングし、ディスプレイの更新。ただし、これはメモリの節約にのみ使用されました。ディスプレイの後半部分で「修正された」ジオメトリを生成している人はいないと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.