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 +?

Foi útil?

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

Se for, pode valer a pena perguntar sobre listas PyGtk ou discussão gtk ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top