在Gtk +中绘制图像的最快方法是什么?

时间:2009-06-06 13:29:00

标签: python gtk pygtk cairo

我有一个想要绘制到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 +中快速绘制图片有哪些替代方案?

3 个答案:

答案 0 :(得分:6)

尝试创建使用与绘图区域相同的色彩映射的Pixmap。

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())

答案 1 :(得分:2)

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

如果是后者,也许您应该调查双缓冲以取代您的更新?基本上我的想法是绘制一个不可见的缓冲区,然后告诉显卡使用新的缓冲区。

也许请查看此页面,其中包含information on double buffering

答案 2 :(得分:0)

可能值得做一些基准测试 - 如果你用一个小区域绘制它仍然很慢?

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