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

real time drawing performance issues with GTK/Cairo

我目前正在开发一种实时数据绘图解决方案,能够频繁接收新数据(高达 1kHz)并以较低的速率(例如 50hz)执行重绘。我使用 FLTK 进行了第一个实现,但我想尝试使用 GTK,因为我以前从未使用过它,而且它对我来说看起来很有希望。

长话短说,我注意到调用 cairo_stroke() 与我使用 FLTK 测量的相比,在绘制线条时会花费很多时间(FLTK 中没有笔画,只有一个 fl_line() 函数)。我试图尽可能地限制笔画,但使用 GTK 时我的渲染时间仍然延长了 5-7 倍。

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

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

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

  1. 在我的工作中,PC 小部件重绘每秒调用大约 25 次,即 25fps。根据我自己的经验,我没有看到比这更多的 fps,可能是 30 或 40。给重绘函数更高的优先级可能会导致其他 mainloop 函数被调用的次数太少。
  2. cairo_line_to 是非常聪明的绘图,它绘制具有抗锯齿、颜色混合、透明度等功能的线条,并且以精确的像素(坐标为 double,因此是 1px 的垂直线可以占两个像素)

据我所知,有两种方法可以加快绘图速度:

  1. 使用 OpenGL
  2. 在图像表面上自定义线条绘制(cairo_image_surface_get_data 并逐像素绘制图像)

当然,还要优化您执行的绘制次数,但这不太可扩展。

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

中有一个 Gtk/Cairo 绘图库

在我做的时候,我设计它是为了绘制大数据集(10k+)。缺点是代码被优化得令人作呕,难以维护。但它完成了工作。我没有研究刷新率,但这可能取决于它。据我所知,我并没有为每一行划线,但我可能是错的。如果这些点是相连的,您可以创建一条路径并一次性抚平它们。

我没有研究 FLTK 进行比较。

Alexander 提到的 OpenGL 很好。您还可以查看开罗的 Wayland 后端。 Wayland 是 X 的替代品,它使用 OpenGL。