8

我有一个要绘制到 gtk.DrawingArea 中并经常刷新的图像/pixbuf,因此 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 不是显示颜色格式造成的。

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

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

4

3 回答 3

7

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

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())
于 2009-06-07T06:29:24.300 回答
2

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

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

也许看看这个页面有一些关于双缓冲的信息。

于 2009-06-06T20:46:53.553 回答
0

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

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

于 2009-08-17T10:03:00.277 回答