2009-06-06 6 views
8

Tengo una imagen/pixbuf que quiero dibujar en un gtk.DrawingArea y actualizo frecuentemente, por lo que la operación de blitting debe ser rápida. Hacerlo de la manera fácil:¿Cuál es la forma más rápida de dibujar una imagen en Gtk +?

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) 

conduce sin embargo a un rendimiento muy lento, probablemente causado por el pixbuf no estar en el formato de pantallas de color.

Tampoco tuve éxito con El Cairo, ya que parece limitado a formatos de 24/32 bits y no tiene un formato de 16 bits (FORMAT_RGB16_565 no está soportado y desaprobado).

¿Qué alternativas hay para hacer dibujos rápidamente en Gtk +?

Respuesta

6

Intente crear Pixmap que use el mismo mapa de colores que su área de dibujo.

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) 

y lo atrae a la pantalla usando

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

¿Realmente no está generando suficiente velocidad bruta/rendimiento? ¿O es solo que estás viendo parpadeo?

Si es el último, ¿tal vez debería investigar el doble buffer para realizar sus actualizaciones? Básicamente, la idea es dibujar en un búfer invisible y luego decirle a la tarjeta gráfica que use el nuevo búfer.

Quizás vea esta página que tiene alguna information on double buffering.

+0

Es el rendimiento no parpadeo. Intento hacer un desplazamiento interactivo/animación en pantalla completa en el OLPC, que no es muy rápido para comenzar y tiene una pantalla bastante grande además de eso y se ejecuta en 16 bits. Hacer lo mismo en SDL funciona sin problemas. Usar un gtk.Layout y usarlo para el desplazamiento es bastante rápido, pero hacer el desplazamiento manualmente dibujando en un gtk.DrawingArea (ya que es posible que desee agregar más efectos más adelante) es completamente inutilizable, lento. – Grumbel

0

Puede valer la pena hacer un poco de evaluación comparativa - si se dibuja con un área pequeña es todavía lento?

Si es así, puede valer la pena preguntar en las listas de correo o PyGTK GTK ...

Cuestiones relacionadas