0

我正在使用 PyQwt 绘制一个适度的数据集(666528 点),它需要很长时间才能重新绘制缩放等。

ncalls  tottime  percall  cumtime  percall filename:lineno(function)
    1    2.115    2.115    2.116    2.116 {built-in method replot}

我期待接近 100 毫秒而不是 2.1 秒

看起来其他人在使用 Qwt 时遇到了同样的问题,但解决方案建议都与 Qwt6 中可用的选项有关,但只有 v5 的 python 绑定。
因此,我将 Qwt 版本 5.2.1 与 Python 2.7.2 一起使用。

在 Qwt6 中,建议为 ClipPolygons、FilterPoints、MinimizeMemory、ImageBuffer 适当地设置 Paint Attributes。据我了解,问题在于绘制所有大致映射到相同像素的点,并且油漆一遍又一遍地重新绘制相同的像素,而不仅仅是绘制一次像素。

我尝试设置一些我在绘图曲线上可用的属性,如下所示,但速度没有明显差异。

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 中实用?我有哪些加快速度的选择?

谢谢

4

2 回答 2

1

好吧,对于您的用例,Qwt 5 应该不会慢很多。

更重要的是使用的是什么版本的Qt,背后是什么类型的图形系统:fe Qt4/X11是硬件加速的。

但至少你的代码的一个容易看到的性能问题是抗锯齿:

您可以在深度放大时启用它(在这种情况下,这没问题,因为几乎所有多边形都被剪掉了),但是当显示超过 600000 行时,它完全没有意义。

显示多点数据集的总体思路(> 600000 就 QPainter 而言不再适中)是为不同的缩放级别实现多个数据集。在这里 QwtPlotWeedingFitter 可以提供帮助(不要在 replot 中使用它!) - 但是你需要 Qwt6。

但最好在 Qwt 支持频道上询问,我不经常在这里阅读。

于 2013-09-13T09:15:20.520 回答
0

Qt 4.7 是关于性能改进的,所以你应该考虑升级!

AFAIR 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。

于 2013-09-15T10:05:49.853 回答