我目前正在开发一种实时数据绘图解决方案,能够经常(最高1kHz)接收新数据并以较低速率(例如50hz)重绘。我使用FLTK进行了第一次实现,但是我想尝试一下GTK,因为我之前从未使用它,看起来很有希望。
为了简化故事,我注意到对cairo_stroke()的调用在绘制线条时需要花费很多时间,而不是我使用FLTK测量的(FLTK中没有笔划,只需要fl_line()函数)。我试图尽可能地限制笔画,但是使用GTK我的渲染时间仍然要长5-7倍。
在DrawingArea上绘制期间使用GTK / Cairo时有没有人注意到这些性能问题?在哪里寻找减少绘图持续时间的任何线索?
注意:后端(要绘制的行和文本的计算)完全相同,因为它是在公共基类中执行的。
答案 0 :(得分:1)
开罗的绘画确实不是很快。有两个主要瓶颈:" draw"发出信号以及cairo如何在引擎盖下划线。
cairo_line_to
是非常智能的绘图,它使用抗锯齿,颜色混合,透明度等绘制线条,并且在精确像素中(坐标是 double ,因此1px垂直线可以占用两个像素) 据我所知,有两种方法可以让绘图更快:
cairo_image_surface_get_data
并逐个像素地绘制图像)当然,还要优化您执行的绘制数量,但这不太可扩展。
答案 1 :(得分:0)
我在https://github.com/pchilds/GtkPlot
中有一个Gtk / Cairo绘图库在我制作它的时候,我设计它用于绘制大型数据集(10k +)。缺点是代码难以维护,无法优化和恶心。但它完成了这项工作。我没有考虑刷新率,但它可能取决于它。从我记忆中来看,我并没有因为每一条线而中风,但我可能错了。如果点已连接,您可以创建一个路径并一次性将它们全部描边。
我没有考虑过FLTK进行比较。
亚历山大提到OpenGL是一个很好的选择。您还可以查看开罗的Wayland后端。 Wayland是使用OpenGL的X的替代品。