当前位置: 首页 > 知识库问答 >
问题:

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

诸葛砚文
2023-03-14

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

为了简短起见,我注意到与我使用FLTK测量的结果相比,在绘制线条时调用cairo_stroke()需要花费很多时间(FLTK中没有笔划,fust一个fl_line()函数)。我试图限制尽可能多的笔划,但使用GTK,渲染时间仍然延长了5-7倍。

有没有人注意到在绘图区域上绘制期间使用GTK / Cairo时出现这样的性能问题?关于在哪里寻找以减少绘图持续时间的任何线索?

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

共有2个答案

庄萧迟
2023-03-14

我有一个Gtk/Carlo绘图库https://github.com/pchilds/GtkPlot

在我制作它的时候,我是为绘制大型数据集(10k)而设计的。缺点是代码非常难以维护,被优化得令人作呕。但它确实起到了作用。我没有研究刷新率,但它可能能达到这个水平。据我所知,我没有划每一行,但我可能错了。如果点连接在一起,你可以创建一条路径,一次划完它们。

我还没有研究FLTK进行比较。

亚历山大提到OpenGL就是一个好的。你也可以看看cairo的wayland后端。Wayland是X的替代品,它使用OpenGL。

璩慎之
2023-03-14

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

  1. 在我的工作中,PC小部件刷新每秒被调用25次,即每秒25帧。在我自己的expirience中,我没有看到过比这更多的fps,可能是30或40。给予重绘函数更多的优先级可能会导致其他主循环函数被调用得太少
  2. cairo_line_to是一种非常聪明的绘制方法,它使用抗锯齿、颜色混合、透明度等绘制线条,并且以精确的像素(坐标是两倍的,因此一条1px的垂直线可以占用两个像素)

据我所知,有两种方法可以让绘图更快:

    < li >使用OpenGL < li >在图像表面上自定义线条绘制(< code > cairo _ image _ surface _ get _ data 并逐像素绘制图像)

当然,还要优化您执行的抽牌次数,但这不太具有可扩展性。

 类似资料:
  • 所以,我想用PyCairo绘制一个图像。效率非常重要,但我使用PyGtk的gtk.gdk.Pixbuf加载图像。我的问题是,通过gtk.gdk检索开罗上下文来呈现Pixbuf是否有性能差异。CairoContext与将Pixbuf转换为cairo的对比。ImageSurface对象,如果是,差异有多大?这是在一个单独的绘图线程中运行的,该线程每秒更新30次左右(但仅当图像需要更新时)。请注意,转换

  • 在GDK/GTK中检索开罗上下文的机制已损坏和/或在文档中未正确描述。我正在尝试从按钮按回调中绘制Gtk绘制区域,但没有成功。文档建议做 然后用开罗的语境画画,然后在 所有这些似乎都适用于GTK 3.22.30(和cairo 1.15.12),但不适用于GTK3.24.30(和cair 1.16.0)。显然有些事情已经改变了。知道吗?下面是一个完整的例子:

  • 问题内容: 我以两个数组获取一些数据:一个用于时间,另一个用于值。当我达到1000点时,我会触发信号并绘制这些点(x =时间,y =值)。 我需要保持与之前相同的图形,但只有一个合理的数字才能避免减慢处理速度。例如,我想在图表上保留10,000点。matplotlib交互式绘图工作正常,但是我不知道如何删除第一个点,这会很快减慢计算机速度。我查看了matplotlib.animation,但它似乎

  • 问题内容: 我有一个应用程序,该应用程序每秒更新一次变量约5到50次,并且我正在寻找某种实时绘制此变化的连续XY图的方法。 尽管不建议使用JFreeChart来获得如此高的更新速率,但是许多用户仍然说它适用于他们。我尝试使用此演示并将其修改为显示随机变量,但似乎一直都在使用100%的CPU。即使我忽略了这一点,我也不希望限于JFreeChart的ui类来构造表单(尽管我不确定其功能到底是什么)。可

  • 问题内容: 我正在编写Java 2D游戏。我正在使用内置的Java 2D图形库,在我从BufferStrategy中从JFrame(有时是全屏)的Canvas中从BufferStrategy获取的Graphics2D上进行绘图。BufferStrategy是双缓冲的。重涂是通过计时器主动完成的。我遇到了一些性能问题,尤其是在Linux上。 Java2D有很多创建图形缓冲区和绘制图形的方式,我只是不

  • 我在java中创建了一个2D游戏,并试图将其分辨率提高到60 fps,分辨率为1920x1080像素。我的游戏逻辑在不到1毫秒的时间内表现良好。但是绘图需要超过10毫秒。在我相当强大的台式机(英特尔i5-4670K@3.40Ghz)上这可能就足够了,但是在我的笔记本电脑(英特尔i5-6300HQ@2.30Ghz)上,游戏已经慢了很多。绘图分为两个主要步骤: > 将游戏的每个部分绘制到Buffere