2009-06-06 102 views
8

我有一个图像/ pixbuf,我想绘制到gtk.DrawingArea中并频繁刷新,所以blitting操作必须快速。这样做的简单方法:什么是在Gtk +中绘制图像的最快方式?

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 +中快速绘制图片?

回答

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

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

如果是后者,也许你应该研究双缓冲来更新你的更新呢?基本上这个想法是画一个看不见的缓冲区,然后告诉显卡使用新的缓冲区。

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

+0

这是吞吐量不闪烁。我正在尝试在OLPC上做一些交互式全屏滚动/动画,它开始时速度不是很快,并且在其上有一个相当大的屏幕,并且它运行在16位。 在SDL中做同样的事情没有问题。使用gtk.Layout并使用它进行滚动相当快,但通过绘制到gtk.DrawingArea手动执行滚动(因为我可能想稍后添加更多效果)完全无法使用缓慢。 – Grumbel 2009-06-06 21:13:22

0

这可能是值得做一些基准测试屏幕 - 如果你用小面积画是它仍然缓慢?

如果是,它可能是值得一问上的PyGTK或GTK邮件列表...

相关问题