2009-06-06 17 views
8

Ich habe ein Bild/Pixbuf, das ich in eine gtk.DrawingArea zeichnen und häufig aktualisieren möchte, so dass die Blitting-Operation schnell sein muss. Tut es den einfachen Weg:Was ist der schnellste Weg, um ein Bild in Gtk + zu zeichnen?

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) 

führt jedoch zu sehr geringe Leistung, verursacht wahrscheinlich durch die pixbuf nicht in dem Displays Farbformat zu sein.

Ich hatte auch keinen Erfolg mit Kairo, da es auf 24/32-Bit-Formate beschränkt scheint und kein 16-Bit-Format hat (FORMAT_RGB16_565 wird nicht unterstützt und ist veraltet).

Welche Alternativen gibt es zum schnellen Zeichnen von Bildern in Gtk +?

Antwort

6

Versuchen Sie, Pixmap zu erstellen, das dieselbe Colormap wie Ihre Zeichenfläche verwendet.

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) 

und es auf dem Bildschirm

dr_area.window.draw_drawable(self.gc, self.image, 0, 0, x, y, *self.image.get_size()) 
2

Produzieren Sie wirklich nicht genug rohe Geschwindigkeit/Durchsatz? Oder sehen Sie nur Flimmern?

Wenn es das letztere ist, sollten Sie möglicherweise die doppelte Pufferung für das Ausführen Ihrer Aktualisierungen untersuchen? Grundsätzlich besteht die Idee darin, in einen unsichtbaren Puffer zu zeichnen und dann der Grafikkarte mitzuteilen, den neuen Puffer zu verwenden.

Vielleicht überprüfen Sie diese Seite, die einige hat.

+0

Es ist Durchsatz flimmert nicht. Ich versuche ein interaktives Vollbild-Scrollen/Animieren auf dem OLPC zu machen, das nicht sehr schnell zu starten ist und darüber hinaus einen ziemlich großen Bildschirm hat und es in 16 Bit läuft. Das Gleiche in SDL funktioniert problemlos. Verwenden Sie eine gtk.Layout und verwenden Sie diese für das Scrollen ist ziemlich schnell zu, aber das manuelle Scrollen durch Zeichnen zu einem gtk.DrawingArea (wie ich später weitere Effekte hinzufügen möchten) ist vollständig unbrauchbar langsam. – Grumbel

0

mit Zeichen es einige Benchmarking kann sich lohnen, zu tun - wenn Sie mit einer kleinen Fläche ziehen, ist es immer noch langsam?

Wenn es ist, kann es sich lohnen, zu fragen auf pygtk oder gtk Mailinglisten ...

Verwandte Themen