【问题标题】:What is the fastest way to draw an image in Gtk+?在 Gtk+ 中绘制图像的最快方法是什么?
【发布时间】:2009-06-06 13:28:59
【问题描述】:

我有一个图像/pixbuf,我想将它绘制到 gtk.DrawingArea 中并经常刷新,因此 blitting 操作必须很快。做起来很简单:

def __init__(self):
  self.drawing_area = gtk.DrawingArea()
  self.image = gtk.gdk.pixbuf_new_from_file("image.png")

def area_expose_cb(self, area, event):
  self.drawing_area.window.draw_pixbuf(self.gc, self.image, 0, 0, x, y)

但是会导致性能非常缓慢,这可能是由于 pixbuf 不是显示颜色格式造成的。

我在 Cairo 上也没有成功,因为它似乎仅限于 24/32 位格式并且没有 16 位格式(FORMAT_RGB16_565 不受支持且已弃用)。

在 Gtk+ 中快速绘制图片有哪些替代方法?

【问题讨论】:

    标签: python gtk pygtk cairo


    【解决方案1】:

    尝试创建与绘图区域使用相同颜色图的像素图。

    dr_area.realize()
    self.gc = dr_area.get_style().fg_gc[gtk.STATE_NORMAL]
    img = gtk.gdk.pixbuf_new_from_file("image.png")
    self.image = gtk.gdk.Pixmap(dr_area.window, img.get_width(), img.get_height())
    self.image.draw_pixbuf(self.gc, img, 0, 0, 0, 0)
    

    并使用

    将其绘制到屏幕上
    dr_area.window.draw_drawable(self.gc, self.image, 0, 0, x, y, *self.image.get_size())
    

    【讨论】:

      【解决方案2】:

      您真的没有产生足够的原始速度/吞吐量吗?还是只是您看到闪烁?

      如果是后者,也许您应该研究双缓冲来执行更新?基本上这个想法是绘制到一个不可见的缓冲区,然后告诉显卡使用新的缓冲区。

      也许看看这个页面有一些information on double buffering

      【讨论】:

      • 吞吐量不闪烁。我正在尝试在 OLPC 上做一些交互式全屏滚动/动画,它开始时不是很快,并且在此之上有一个相当大的屏幕,它以 16 位运行。在 SDL 中做同样的事情没有问题。使用 gtk.Layout 并使用它进行滚动相当快,但是通过绘制到 gtk.DrawingArea 手动滚动(因为我可能想稍后添加更多效果)完全无法使用缓慢。
      【解决方案3】:

      可能值得做一些基准测试 - 如果你用小面积绘图,它仍然很慢吗?

      如果是,可能值得在 pygtk 或 gtk 邮件列表中询问...

      【讨论】:

        猜你喜欢
        • 2012-11-18
        • 1970-01-01
        • 2010-09-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-25
        相关资源
        最近更新 更多