Qual é a maneira mais rápida para desenhar uma imagem em Gtk +?
Pergunta
Eu tenho uma imagem / pixbuf que eu quero desenhar em um gtk.DrawingArea e atualizar frequentemente, por isso a operação blitting tem que ser rápido. Fazê-lo a maneira fácil:
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)
No entanto leva a um desempenho muito lento, provavelmente causado pelo pixbuf não estar no formato exibe cor.
Eu não tinha sucesso com Cairo também, como parece limitada a 24 / 32bit formatos e não tem um formato de 16 bits (FORMAT_RGB16_565 não é suportada e obsoleto).
Que alternativas existem para desenhar imagens rapidamente em Gtk +?
Solução
Tente criar Pixmap que utiliza o mesmo mapa de cores como sua área de desenho.
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 puxando-o para a tela usando
dr_area.window.draw_drawable(self.gc, self.image, 0, 0, x, y, *self.image.get_size())
Outras dicas
Você realmente não gerando bastante crua velocidade / débito? Ou é apenas que você está vendo cintilação?
Se ele é o último, talvez você deve investigar o buffer duplo para perfomring suas atualizações em vez disso? Basicamente, a idéia é chamar a um tampão invisível em seguida, dizer a placa de vídeo para usar o novo buffer.
Talvez confira esta página que tem algumas informações o buffer duplo .
Pode valer a pena fazer alguma avaliação comparativa -? Se você desenhar com uma pequena área ainda é lenta ??p>
Se for, pode valer a pena perguntar sobre listas PyGtk ou discussão gtk ...