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