2

在我的 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

对于应该是相同数量的工作来说,时间要长得多。更奇怪的是,它增加了 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();

我浏览了 and 的源代码QPainter::end()QOpenGLPaintEngine::end()但它似乎只是状态恢复并确保绘制队列已被刷新。考虑到我没有设置任何状态请求,或者通过 Qt 进行任何绘图(我所有的调用都是原始 OpenGL) - 它不应该有任何事情要做。

为什么即使QPainter在堆栈上创建实例并且每个视口都在做相同数量的工作,时间也会增加?

4

0 回答 0