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

C++ GTK/Cairo的实时绘图性能问题,c++,gtk,cairo,C++,Gtk,Cairo,我目前正在开发一种实时数据绘图解决方案,该解决方案能够频繁接收新数据,频率高达1kHz,并以较低的速率(例如50hz)重新绘制。我用FLTK做了第一个实现,但我想尝试一下GTK,因为我以前从未使用过它,它对我来说很有前途 为了简短起见,我注意到在绘制线条时调用cairo_stroke要花很多时间,与我使用FLTK进行测量相比,FLTK中没有笔划,fust是fl_line函数。我试图限制尽可能多的笔划,但使用GTK我仍然可以获得5-7倍的渲染时间 在绘图区域绘图期间使用GTK/Cairo时,是否有

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

为了简短起见,我注意到在绘制线条时调用cairo_stroke要花很多时间,与我使用FLTK进行测量相比,FLTK中没有笔划,fust是fl_line函数。我试图限制尽可能多的笔划,但使用GTK我仍然可以获得5-7倍的渲染时间

在绘图区域绘图期间使用GTK/Cairo时,是否有人注意到此类性能问题?关于减少绘图持续时间的途径


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

Cairo drawing确实不是很快。有两个主要瓶颈:绘图信号的发出频率和cairo如何在引擎盖下绘制线条

在我的工作中,PC小部件redraw每秒调用25次,即25fps。在我自己的经验中,我没有见过比这更多的fps,可能是30或40。对重绘函数给予更高的优先级可能会导致很少调用其他主循环函数。 cairo_line_to是一款非常智能的绘图工具,它使用抗锯齿、颜色混合、透明度等绘制线条,并且在精确的像素坐标中是双精度的,因此1px垂直线可以占据两个像素 据我所知,有两种方法可以加快绘图速度:

使用OpenGL 在图像曲面上自定义线条绘制cairo\u image\u surface\u获取数据并逐像素绘制图像
当然,还可以优化执行的绘图数量,但这不是很好的可扩展性。

我有一个Gtk/Cairo绘图库

在我制作它的时候,我设计它用于绘制10k+的大型数据集。不利的一面是,代码在经过优化后难以维护。但它成功了。我没有调查刷新率,但可能取决于刷新率。从我的记忆中,我没有每一行都画,但我可能错了。如果点是连接的,您可以创建一条路径,一次完成所有点的笔划

我还没有调查过FLTK以作比较


Alexander提到OpenGL是一个很好的例子。您还可以查看cairo的wayland后端。Wayland是使用OpenGL的X的替代品。

请注意,显示渲染代码可能会有所帮助?你是每次都在重画还是在使用剪辑?您正在使用gtk_widget_queue_draw_区域吗?它还没有完成,所以我还没有将它推到Github。您已经可以找到包含核心库和当前实现的链接。一旦一切就绪,我将在接下来的几天中添加GTK版本的链接。但是,是的,我每次都会重新绘制整个图形,因为每次都会重新绘制新的点,所以新的线条和可能的轴的新比例。绘制整个图形的成本很高,可能不需要。如果你在高速下做了太多的工作,你确实会有性能问题。作为对哪个信号的响应,您称之为gtk_widget_queue_draw?可以是手动调用,也可以是一些定时器首选的解决方案,在50Hz的顶部运行。所以不,我不会为每个到达的数据重新绘制所有内容。谢谢你提供的信息。我怀疑有一些抗锯齿,因为坐标、宽度等都是浮点值,所以cairo_line_可能比简单的线描FLTK需要更多的计算。我将看一看图像表面上的自定义线条图,但我可能不会太麻烦,因为我的目标是为用户提供不同的绘图后端,每个后端都有各自的优缺点