2

私の MDI サブウィンドウ GUI には 2 つのタブがあります。1 つのタブには 1 つの大きなQGLWidget派生クラスがあり、他の 4 つQGLWidgetのタブにはスプリッターで区切られています。それぞれ独自の OpenGL コンテキスト (実際のペイント用) を持ち、5 つすべてで別のものを共有し (ジオメトリ データ用)、アプリケーション全体で 1 つを共有します (シェーダー用)。

単一のビューポート タブで描画すると、予想どおり非常に高速です。ただし、クワッド ビューで描画する場合 (各ビューポートは作成順にタイマーから更新されます)、レンダリング速度は急落し、リストが反復されるにつれて各ビューポートで悪化します。

Qt私はプロファイリングを開始し、シングル ビューよりもクワッド ビューの方がはるかに時間がかかっていた通話に検索を絞り込みました。

QPainter::end();

したがって、大きな単一のビューポートのみが表示されている場合、次のQPainter::end()ようなタイミング (マイクロ秒単位) が得られます。

Total time(us): 981
Number of calls: 32
Average call time(us): 30.656250

かなり合理的です。しかし、クアッド ビューに切り替えると、次のようになります。

Viewport 1:
Total time(us): 196023
Number of calls: 32
Average call time(us): 6125.718750

Viewport 2:
Total time(us): 509769
Number of calls: 32
Average call time(us): 15930.281250

Viewport 3:
Total time(us): 518504
Number of calls: 32
Average call time(us): 16203.250000

Viewport 4:
Total time(us): 518226
Number of calls: 32
Average call time(us): 16194.562500

同じ量の作業であると想定されているものに対して、はるかに長くなります。さらに奇妙なことに、200 倍 (!) 増加し、安定する前に次のビューポートで 2.5 倍になります。テストをより長く実行すると、ほぼ同じ測定値が得られます-それ以上増加しません.

問題のQPainterコードは次のとおりです。

QPainter p;
p.begin( this );
p.beginNativePainting();
glUseProgram( program_ );

glActiveTexture( GL_TEXTURE0 );
glBindTexture( GL_TEXTURE_2D, buffer2d_->texture() );
glActiveTexture( GL_TEXTURE1 );
glBindTexture( GL_TEXTURE_2D, buffer3d_->texture() );

surfaceBuf_.bind();
glDrawArrays( GL_TRIANGLE_FAN, 0, 4 );
surfaceBuf_.unbind();

p.endNativePainting();
p.end();

と のソース コードを参照しましたが、状態の復帰と、描画キューがフラッシュされていることを確認しているようですQPainter::end()QOpenGLPaintEngine::end()状態要求を設定したり、Qt を介して描画したりしないことを考えると (すべての呼び出しは生の OpenGL です)、何もする必要はありません。

QPainterインスタンスがスタック上に作成され、各ビューポートが同じ量の作業を行っているにもかかわらず、時間が増加するのはなぜですか?

4

0 に答える 0