在Gtk+中绘制图像的最快方法是什么?
我有一张图片/像素缓冲区,想把它画到一个gtk.DrawingArea上,并且需要频繁刷新,所以这个绘制操作必须要快。用简单的方法来做:
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)
但是这样做的效果很慢,可能是因为像素缓冲区的颜色格式和显示器不匹配。
我用Cairo也没成功,因为它似乎只支持24位和32位的格式,而不支持16位的格式(FORMAT_RGB16_565不被支持且已被弃用)。
在Gtk+中,有什么其他方法可以快速绘制图片呢?
3 个回答
0
可以试着做一些性能测试——如果你在一个小区域内绘图,速度还是慢吗?
如果还是慢的话,可能可以去pygtk或者gtk的邮件列表上问问...
2
你真的没有产生足够的速度或处理能力吗?还是说你只是看到了一些闪烁的现象?
如果是后者,那你可能需要考虑使用双缓冲来进行更新。简单来说,就是先在一个看不见的缓冲区里绘图,然后再告诉显卡使用这个新的缓冲区。
也许你可以看看这个页面,上面有一些关于双缓冲的信息。
7
试着创建一个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())