在我的 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
在堆栈上创建实例并且每个视口都在做相同数量的工作,时间也会增加?