Какой самый быстрый способ нарисовать изображение в Gtk +? - PullRequest
8 голосов
/ 06 июня 2009

У меня есть изображение / 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)

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

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

Какие есть альтернативы быстрому рисованию картинок в Gtk +?

Ответы [ 3 ]

6 голосов
/ 07 июня 2009

Попробуйте создать 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 голосов
/ 07 июня 2009

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

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

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

0 голосов
/ 17 августа 2009

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

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

...