0

ダブルバッファリングを使用する OpenGL アプリケーションは、どのようにして 60 fps (ディスプレイのリフレッシュ制限) を超えますか?
ドライバの実装、つまり、ダブル バッファリングまたはトリプル バッファリングのどちらを使用するかによって異なりますか?

次のアプリケーションのメイン ループを検討します。

while (1) {
  draw_scene();
  swap_buffers(); 
}

ループの 2 番目のステートメントは、display vsync との複雑な同期を使用せず、画像を表示するときにテアリングしたくない場合に必須です。このようなループでは、私の fps はドライバーの実装と相関しています。ダブル バッファリングではパイプラインがストールし、約 60 fps をアーカイブしますが、トリプル バッファリングではストールは発生せず、fps はビデオカードのスループットのみに依存します。したがって、高 fps の opengl アプリケーションをアーカイブする必要がある場合は、アプリケーション内にトリプル バッファリングを実装する必要があります。私は正しいですか?

4

1 に答える 1

2

ダブルバッファリングを使用した OpenGL アプリケーションは、60 fps (ディスプレイのリフレッシュ制限) を超えてアーカイブしますか?

ディスプレイの垂直帰線との同期を無効にする。

ダブル バッファリングではパイプラインがストールし、約 60 fps をアーカイブしますが、トリプル バッファリングではストールは発生せず、fps はビデオカードのスループットのみに依存します。

ダブル バッファリングとトリプル バッファリングの唯一の違いは、表示するために「キューにある」フレームの量です。事実上、別のフレームのレイテンシーが追加されます。ただし、合計フレームレートは増加しません。また、ディスプレイ デバイスが処理できるよりも多くのフレーム/秒をレンダリングしようとしてもほとんど意味がありません。

バッファ スワップはパイプラインを停止しません。パイプラインの停止とは、パイプライン内の一部の操作によって、デバイスがパイプライン全体を強制的にフラッシュし、大量の操作をリプレイする必要があるため、合計スループットが低下することを意味します。ただし、バッファ スワップは同期ポイントです。つまり、パイプラインが完了するまで待機します。これは、GPU とドライバーに、割り当て解除のマークが付いたメモリのクリーンアップなどの他のことを行うための時間を与えるため、実際には望ましいことです。SwapBuffers ブロックの期間は、ユーザー入力の処理、I/O、ネットワーキングなどに使用できるプログラムの CPU 時間を他のスレッドに与えるため、プログラムの処理にも有益です。

于 2012-09-14T11:38:29.807 に答える