14

今日のカードはレンダー コマンドのリストを保持し、glFlushまたはの呼び出しでのみフラッシュするように見えるため、glFinishダブル バッファリングは本当に必要なのでしょうか? SDL/OpenGL を使用して Linux (ATI Mobility radeon カード) で開発している OpenGL ゲームは、init コードでおよび にSDL_GL_swapbuffers()置き換えられるglFinish()と、実際にはちらつきが少なくなります。SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER,0)これは私のカードの特定のケースですか、それともすべてのカードでそうなる可能性がありますか?

編集:これの原因が KWin であることを発見しました。datenwolfさんの言う通り、同期せずに合成したことが原因だったようです。KWin 合成をオフにすると、ゲームはソースコードのパッチなしで正常に動作します

4

2 に答える 2

21

ダブルバッファリングとglFinishは、2 つの非常に異なるものです。

glFinishすべての描画操作が完了するまで、プログラムをブロックします。

ダブル バッファリングは、レンダリング プロセスをユーザーから隠すために使用されます。ダブルバッファリングがなければ、ディスプレイのリフレッシュ頻度が無限に高いと仮定すると、すべての描画操作がすぐに表示されます。実際には、ある状態でシーンの一部が表示されたり、残りが表示されなかったり、他の状態で表示されたり、画像が不完全であったりするなど、いくつかの表示アーティファクトが発生します。レンダリングが終了した後でのみ、これをフロント バッファと交換し、ディスプレイ デバイスに送信します。

現在、ウィンドウ管理の合成が一般的になっています。Windows には Aero、MacOS X Quartz Extreme があり、Linux では少なくとも Unity と GNOME3 シェルは、可能であれば合成を使用します。要点は次のとおりです。合成は技術的にダブルバッファリングを作成します。Windows はオフスクリーン バッファに描画し、これらの最終的な画面が合成されます。したがって、合成機能を備えたマシンで実行している場合、プログラムで実行するとダブルバッファリングは一種の冗長であり、必要なのはある種の同期メカニズムだけで、次のフレームの準備ができたときにコンポジターに通知します。MacOS Xにはこれがあります。X11 にはまだ適切な同期スキームがありません。メーリストの次の投稿を参照してください: http://lists.freedesktop.org/archives/xorg/2004-May/000607.html

TL;DR: ダブル バッファリング とglFinishは別のものであり、見栄えを良くするには (何らかの種類の) ダブル バッファリングが必要です。

于 2011-07-01T06:36:48.953 に答える
2

マシン上にないものに一般化できるものよりも、レンダリングしているものやハードウェアに関係していると思います。いいえ:これをやろうとしないでください。

ああ、マルチサンプリングを忘れないでください。多くの実装では、バック バッファーのみをマルチサンプリングします。フロント バッファはマルチサンプリングされません。スワップを行うと、マルチサンプル バッファからダウンサンプリングされます。

于 2011-07-01T05:42:46.460 に答える