2016-03-31 8 views
1

バックバッファとフロントバッファ間をスワップすると、バックバッファの内容が不定になります。私はそれをGLX、EGL、WGLのような "ウィンドウシステム"を使って定義したいと思っています。 OpenGL(glClear)などの「ネイティブ」レンダラを使用することは私のバックアップ計画であり、気にする必要はありません。それがバックアップである理由は、ネイティブレンダリングコンテキストを混乱させたくないからです。私はこの質問のためにX/GLXに固執しますが、あなたが他の環境でそれを行う方法を説明する傾向があると感じたら、先に進んでください。ウィンドウシステム(GLX)を使用したスワップバッファとクリアバック

Xlibドキュメント(http://www.x.org/docs/X11/xlib.pdf)から、「背景ピクセル」(途中で素晴らしい名前...)でウィンドウをクリアする操作XClearWindowが見つかりました。

  1. XClearWindowはフロント/バックまたは両方のバッファをクリアしますか?私はバックバッファーが理にかなっていると思うが、Xlib文書だけではそれを理解できない。そして誰かがトリプルバッファーについて尋ねれば、それは私ではなかった!
  2. OpenGLレンダリングと同期しているのですか?たとえば、操作の前にglxWaitGLを呼び出すなどして自分自身を同期させる必要がありますか?
  3. コマンドがブロックされていますか?完了するまで停止しますか?実装に依存しますか?

ウィンドウシステム(GLX)を使用したスワップ後にバックバッファをクリアする方法に関するその他の提案

乾杯!

答えて

1

バックバッファとフロントバッファ間をスワップすると、バックバッファの内容が不定になります。

はい、それは良いことです。

I'dは

なぜWGL

、例えばGLX、EGLとして、 "ウィンドウシステム" を使用して定義しますか?これを行うこととは別に、これは未定義です。スワップ後のバックグラウンドは、何も良いものから来ないでしょう。

OpenGL DDXが同期させるXClearWindowを認識している場合、せいぜいパフォーマンスが低下するだけです。最悪の場合、その結果が予期し得ない競合条件を導入しています。

ウィンドウシステム(GLX)を使用したスワップ後にバックバッファをクリアする方法に関するその他の提案

適切なOpenGL操作を使用してください:glClear(…)

+0

スワップ後にコンテンツを定義すると、定義したので定義されています。ウィンドウ処理システムのスワップはパフォーマンスを低下させないので、ウィンドウシステムのクリアがパフォーマンスを低下させることはないと信じることは合理的です。 OpenGLはウィンドウ処理システムではありません。 glClearを使用することは既知のバックアップ計画であり、私は明示的にそれを言わないように頼んだ。パズルのこの部分が世界の支配を保証する私の壮大な計画については、あなたは気にしないでください。 OpenGLとのシステム同期をウィンドウ処理について知っておいてください。 – Andreas

+0

@Andreas値が '0xDEADBEEF'になるように' * NULL'を定義することはできますが、その実装がその定義を尊重しないなら、それはまったく役に立たないでしょう。あなたは、ウィンドウシステムがOpenGL実装の 'glClear'よりも優れていると思いますか?あなたの質問は[XY問題](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)のように聞こえます。 –

+1

@アンドレアス:あなたは 'glClear'よりもパフォーマンスが上がることはほとんどありません。 XClearWindowは、実際に複雑な塗りつぶし操作を実行することがあります(定義された背景タイルでウィンドウを埋める)。また、XClearWindowの主な実装は、GPUメモリへのCPU駆動メモリ書き込みとして実装される可能性があります。それはDMAによって支援されるかもしれないし、そうでないかもしれないが、決してGPUへの単一のコマンドほど高速ではない*メモリの全領域が特定の値に設定されている*。私は*マーキング*: – datenwolf

0

いくつかの調査の後、私は解決策を見つけたかもしれません。ドキュメントは整然としたようですが、実際にこれをテストする機会はありませんでした。コードを入力すると答えが更新されます。

XClearWindowはフロント/バックまたは両方のバッファをクリアしますか?

Xにはダブルバッファという概念がありません。ダブルバッファウィンドウに対してXと対話するときはいつでも、両方のバッファが影響を受けます。例外は、前面バッファー上でのみ動作するXGetImageのような読み取り操作です。

XしかしXダブルバッファ拡張機能、またはxdbe介してダブルバッファの概念に拡張される。http://www.x.org/releases/X11R7.6/doc/xextproto/dbe.html#dbeswapbuffers

xdbeはGLXによって提供glxSwapBuffersと同様XdbeSwapBuffers動作を提供します。いくつかの重要な違いがあります:glxSwapBuffersが行うよう

  • XdbeSwapBuffersは、任意のクライアント APIを持つ任意の同期を管理しません。ユーザーは手動でこれを行う必要があります。幸いなことに、GLXは の同期処理(glxWaitGLglxWaitX)を実行して、実行を停止しません。それは私の2番目の質問にかなり答える。
  • glxSwapBuffersは、現在の コンテキストに対して暗黙的なフラッシュ(glFlush)を実行します。 XdbeSwapBuffersはそうではありません。フラッシュするかどうかは、 アプリケーションデザイナーの決定です。
  • XdbeSwapBuffersは、1回の呼び出しで多くのウィンドウをスワップできます。
  • スワップ時にXdbeSwapBuffersの動作が異なる可能性があります。 '未定義'、 '背景'、 '手が届かない'、 'コピー済み'。詳細はリンク をご覧ください。

スワップを定義済みの色に変更した後にクリアするには、「背景」のスワップ動作が必要です。クリアする対象は、Xから設定できます。ピックスマップまたは単色(背景ピクセル)でも構いません。

コマンドはブロックされていますか?つまり、完了するまで停止しますか?実装 依存ですか?

Xを使用するアプリケーションは、多くの状況で独自の同期メカニズムを提供する必要があります。これは非同期実行パターンを示しますが、標準自体はそれを必要としません。私は、ほとんどのプラットフォームのほとんどのコマンドが非同期に実行されるという強力な示唆を持って、 "実装定義"を行っています。

関連する問題