Qual è il modo più veloce per disegnare un'immagine in Gtk +?
Domanda
Ho un'immagine / pixbuf che voglio disegnare in un gtk.DrawingArea e aggiornare frequentemente, quindi l'operazione di copiarlo sul video deve essere veloce. Farlo nel modo più semplice:
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)
Tuttavia porta a prestazioni molto lenta, probabilmente causato dalla pixbuf non essere nel formato display a colori.
Non ho avuto successo con Il Cairo o, come sembra limitato a 24 formati / 32bit e non hanno un formato a 16 bit (FORMAT_RGB16_565 non è supportato e deprecato).
Quali alternative ci sono per disegnare immagini rapidamente in Gtk +?
Soluzione
Prova a creare Pixmap che utilizza la stessa mappa di colori come area di disegno.
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)
e il disegno allo schermo usando
dr_area.window.draw_drawable(self.gc, self.image, 0, 0, x, y, *self.image.get_size())
Altri suggerimenti
Stai davvero non generando abbastanza grezzo velocità / rendimento? O è solo che si sta vedendo tremolante?
Se è quest'ultimo, forse si dovrebbe indagare il doppio buffering per perfomring gli aggiornamenti, invece? In sostanza l'idea è quella di attirare a un buffer invisibile poi dire la scheda grafica per utilizzare il nuovo buffer.
Forse verificare questa pagina che ha un po ' informazioni sul doppio buffering .
Può valere la pena fare un po 'di benchmarking -? Se si disegna con una piccola area è ancora lento
Se lo è, potrebbe essere la pena chiedere su liste PyGTK o mailing gtk ...