当多个QGLWidgets可见时,QPainter :: end()会变慢

时间:2012-11-03 23:46:12

标签: c++ qt opengl

在我的MDI子窗口GUI中,我有两个选项卡:在一个选项卡中是一个大型QGLWidget派生类,另外四个QGLWidget由分隔符分隔。它们每个都有自己的OpenGL上下文(用于实际绘制),在所有5个(用于几何数据)中共享另一个,并共享一个应用程序范围(用于着色器)。

在单个视口选项卡中绘制时,它的速度非常快;但是当在四边形视图中绘制时(每个视口都是按创建顺序从计时器更新),随着列表的迭代,渲染速度会随着每个视口的下降而变得更糟。

我开始分析搜索范围,并将搜索范围缩小为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

应该是相同数量的工作的时间要长得多。更奇怪的是,它在稳定之前增加了200x(!),然后是下一个视口的2.5x。如果我运行测试的时间越长,它们的读数几乎完全相同 - 它不再增加。

有问题的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实例,并且每个视口执行相同数量的工作,时间也会增加?

0 个答案:

没有答案