实时绘制GTK / Cairo的性能问题

时间:2018-04-10 15:56:53

标签: c++ gtk cairo

我目前正在开发一种实时数据绘图解决方案,能够经常(最高1kHz)接收新数据并以较低速率(例如50hz)重绘。我使用FLTK进行了第一次实现,但是我想尝试一下GTK,因为我之前从未使用它,看起来很有希望。

为了简化故事,我注意到对cairo_stroke()的调用在绘制线条时需要花费很多时间,而不是我使用FLTK测量的(FLTK中没有笔划,只需要fl_line()函数)。我试图尽可能地限制笔画,但是使用GTK我的渲染时间仍然要长5-7倍。

在DrawingArea上绘制期间使用GTK / Cairo时有没有人注意到这些性能问题?在哪里寻找减少绘图持续时间的任何线索?

注意:后端(要绘制的行和文本的计算)完全相同,因为它是在公共基类中执行的。

2 个答案:

答案 0 :(得分:1)

开罗的绘画确实不是很快。有两个主要瓶颈:" draw"发出信号以及cairo如何在引擎盖下划线。

  1. 在我的工作中,PC小部件重绘每秒调用大约25次,即25fps。在我自己的经验中,我没有看到fps远远超过那个,可能是30或40.给予重绘功能更优先考虑可能导致其他主循环功能被调用太少。
  2. cairo_line_to是非常智能的绘图,它使用抗锯齿,颜色混合,透明度等绘制线条,并且在精确像素中(坐标是 double ,因此1px垂直线可以占用两个像素)
  3. 据我所知,有两种方法可以让绘图更快:

    1. 使用OpenGL
    2. 图像表面上的自定义线条绘制(cairo_image_surface_get_data并逐个像素地绘制图像)
    3. 当然,还要优化您执行的绘制数量,但这不太可扩展。

答案 1 :(得分:0)

我在https://github.com/pchilds/GtkPlot

中有一个Gtk / Cairo绘图库

在我制作它的时候,我设计它用于绘制大型数据集(10k +)。缺点是代码难以维护,无法优化和恶心。但它完成了这项工作。我没有考虑刷新率,但它可能取决于它。从我记忆中来看,我并没有因为每一条线而中风,但我可能错了。如果点已连接,您可以创建一个路径并一次性将它们全部描边。

我没有考虑过FLTK进行比较。

亚历山大提到OpenGL是一个很好的选择。您还可以查看开罗的Wayland后端。 Wayland是使用OpenGL的X的替代品。