Каков самый быстрый способ нарисовать изображение в 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...