天天看点

11.QCustomPlot绘图性能改善

  https://www.qcustomplot.com/documentation/performanceimprovement.html 绘图性能改善

QCustomPlot采用了各种技术,例如自适应采样和文本对象缓存,以减少重新绘制所需的时间。但是,某些功能(如复杂的半透明填充和粗线)仍会导致速度显着下降。如果您在应用程序中注意到这一点,则这里有一些有关如何提高重复打印性能的提示。

到目前为止,大部分时间都花在了绘图功能上,特别是在高密度图形和其他绘图表的绘图上。为了获得最佳性能,请考虑以下几点:

  • 特别是在图形,粗线,半透明颜色下/之间使用复杂填充时:通过QCustomPlot :: setOpenGl启用QCustomPlot的OpenGL硬件加速渲染。有关如何正确启用OpenGL加速的详细信息,请参见此处的文档。OpenGL加速可用于QCustomPlot支持的所有Qt版本,并且适当地选择了各自的后端。 对于5.0之前的Qt版本,QCustomPlot自己的OpenGL加速的替代方法是在创建QApplication对象之前提供“ -graphicssystem opengl”作为命令行参数或进行调用。这可以实现应用程序范围的OpenGL加速。

    QApplication::setGraphicsSystem("opengl")

    请注意,使用OpenGL加速时,最大帧速率可能会受到显示器的垂直同步频率的限制(可以在图形卡驱动程序配置中禁用VSync)。因此,对于简单绘图(潜在帧速率远高于每秒60帧),OpenGL加速可能会在数值上低于默认软件渲染器,因为它没有限制在VSync频率上。
  • 避免笔宽度大于一的线。这与默认软件渲染器特别相关,而与OpenGL加速无关。
  • 避免复杂的填充,例如,在具有数千个点的图形之间进行通道填充。这与默认软件渲染器特别相关,而与OpenGL加速无关。
  • 如果仅由于非复杂对象(例如,某项)在图中具有相对静态但复杂的图形而发生变化时,才经常需要调用完整的QCustomPlot :: replot,请考虑将定期变化的对象放置在自己的图层上并对其进行设置模式(QCPLayer :: setMode)到QCPLayer :: lmBuffered。这使QCustomPlot为该层分配了专用的绘制缓冲区,并允许使用QCPLayer :: replot单独对其进行重新绘制,而与包含潜在复杂图和慢图的其他层无关。有关详细信息,请参见相应方法的文档。
  • 仅Qt4:使用Qt 4.8或更高版本。与Qt 4.7相比,性能提高了两倍或三倍。但是,QPainter损坏了,并且绘制像散点图这样的像素精确元素看起来不如Qt 4.7好。因此,切换到Qt 4.8时是性能与图质量之间的折衷。QCustomPlot在内部尝试解决此类最严重的故障。
  • 要在范围拖动过程中提高响应速度,请考虑将QCustomPlot :: setNoAntialiasingOnDrag设置为true。这仅在使用默认软件渲染器时才有意义。(OpenGL抗锯齿不能即时切换,这将需要对样本缓冲区进行昂贵的重新分配。)
  • 仅限于Qt4:在X11(GNU / Linux)上,请避免使用较慢的本机绘图系统,请通过提供“ -graphicssystem raster”作为命令行参数或在创建QApplication对象之前调用来使用栅格

    QApplication::setGraphicsSystem("raster")

  • 避免使用任何类型的alpha(透明)颜色,尤其是在填充中。
  • 避免任何形式的抗锯齿,尤其是在图形行中(请参见QCustomPlot :: setNotAntialiasedElements)。这仅在使用默认软件渲染器时才有意义。
  • 避免重复设置完整的数据集,例如使用QCPGraph :: setData。如果大多数数据点保持不变,例如在运行的测量中,请改用QCPGraph :: addData。您可以通过QCPGraph :: data访问和操作现有数据。
  • 作为最后的选择,请尝试减少任何给定时刻在可见键范围内的数据点数量,例如通过限制最大键范围跨度(请参阅QCPAxis :: rangeChanged信号)。QCustomPlot可以非常有效地优化掉数百万个屏幕外点。

继续阅读