Каков самый быстрый способ нарисовать изображение в Gtk+?

У меня есть изображение / pixbuf, которое я хочу нарисовать в 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)

однако приводит к очень низкой производительности, вероятно, вызвано pixbuf не в цветовом формате дисплеев.

У меня тоже не было успеха с Cairo, так как он ограничен форматами 24 / 32bit и не имеет формата 16bit (FORMAT_RGB16_565 не поддерживается и возражавшую.)

какие альтернативы есть для быстрого рисования изображений в Gtk+?

3 ответов


попробуйте создать 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())

вы действительно не генерируете достаточную сырую скорость / пропускную способность? Или ты просто видишь мерцание?

Если это последнее, возможно, стоит исследовать двойную буферизацию вместо perfomring ваши обновления? В основном идея заключается в том, чтобы нарисовать невидимый буфер, а затем сказать видеокарте использовать новый буфер.

возможно, проверьте эту страницу, которая имеет некоторые информация о двойной буферизации.


может быть стоит сделать некоторые бенчмаркинг - если вы рисуете с небольшой площадью это еще медленно?

Если это так, возможно, стоит спросить в списках рассылки pygtk или gtk...