我正在使用PyQwt绘制一个中等数据集(666528点),并且需要花费很长时间来重新绘制缩放等等。
ncalls tottime percall cumtime percall filename:lineno(function)
1 2.115 2.115 2.116 2.116 {built-in method replot}
我期待的东西接近100mS而不是2.1秒
看起来其他人在Qwt上遇到了同样的问题,但是解决方案的消息都与Qwt6中的选项有关,但是v5只有python绑定。
因此,我正在使用Qwt版本5.2.1和Python 2.7.2。
在Qwt6中,建议是为ClipPolygons,FilterPoints,MinimizeMemory,ImageBuffer设置Paint属性。根据我的理解,问题在于绘制所有可能映射到相同像素的点,并且油漆一遍又一遍地重新绘制相同的像素,而不是仅仅绘制像素一次。
我已尝试在Plot Curve上设置一些我可用的属性,如下所示,但速度没有明显差异。
def addSignals(self, signals):
for signal in signals:
curve = QwtPlotCurve(signal.name())
curve.setPaintAttribute(QwtPlotCurve.PaintFiltered, False)
curve.setPaintAttribute(QwtPlotCurve.ClipPolygons, True)
curve.setData(signal.x(), signal.y())
curve.setRenderHint(QwtPlotItem.RenderAntialiased)
curve.setPen(QPen(Qt.cyan))
curve.attach(self)
self.replot()
通过setData加载到PlotCurve对象的数据是来自信号对象的numpy数组。并且所示方法附加到子类QwtPlot对象
我是否错过了我的Qwt版本中可用的选项,还是仅在v6中实用? 我有什么选择加快这个速度?
由于
答案 0 :(得分:1)
嗯,Qwt 5对你的用例来说不应该慢得多。
更重要的是使用了什么版本的Qt以及背后的图形系统类型:f.e Q4 / X11是硬件加速的。
但至少一个容易看到的代码性能问题是抗锯齿:
你可以在深度放大时启用它(在这种情况下它没有问题,因为几乎所有多边形都被剪掉了),但是当显示超过600000行时,它完全没有意义。
显示多个点的数据集背后的总体思路(> Q> 60000在QPainter方面不再适中)是为不同的缩放级别实现多个数据集。这里QwtPlotWeedingFitter可以提供帮助(不要在replot中使用它!) - 但是你需要Qwt6。
但更好地询问Qwt支持频道,我不经常在这里阅读。
答案 1 :(得分:0)
Qt 4.7是关于性能改进的,所以你应该考虑升级!
Qt 4.6中的光栅绘制引擎(QWS或Windows中的光栅绘制引擎)在QPainter :: drawPolyline()中存在严重的性能问题,其中时间增加超过线性(猜测一些算法O(n * n) )参与了一些积分 - 对于一条600000行的曲线,它会大大打击你。
您的用例最快的选择是Qt4 / X11,因为它是真正的硬件加速。请注意,使用Qt 4.8,您必须手动启用“本机”图形系统(在它是X11上的默认设置之前),并且Qt5 / X11不再加速。
使用C ++时,您可以使用Qwt 6.1,您还可以选择基于OpenGL的画布。我也有一些代码通过离线QGLPixelBuffer呈现像素图,很有可能使它进入Qwt 6.2。