2009-06-06 98 views
8

gtk.DrawingAreaに描画して頻繁にリフレッシュするimage/pixbufがあるので、blitting操作が高速でなければなりません。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) 

ただし、pixbufが表示色形式ではないため、パフォーマンスが非常に低下します。

24/32ビットフォーマットに限られているように、16ビットフォーマット(FORMAT_RGB16_565はサポートされておらず、推奨されていません)のため、私はカイロでもうまくいっていませんでした。

Gtk +で写真をすばやく描画するには、どのような方法がありますか?

答えて

6

描画領域と同じカラーマップを使用するPixmapを作成してみてください。

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) 

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

生のスピード/スループットが実際には十分ではありませんか?それとも、ちらちら見ているだけですか?

これが後者の場合は、代わりにアップデートを実行するためにダブルバッファリングを調べるべきでしょうか?基本的には、目に見えないバッファに描画し、新しいバッファを使用するようにグラフィックスカードに指示することです。

information on double bufferingがあるこのページをチェックしてください。

+0

それはスループットがちらつくではありません。私はOLPC上でいくつかのインタラクティブなフルスクリーンスクロール/アニメーションをやろうとしています。これは非常に速く始めるのではなく、16ビットで実行されるものです。 SDLで同じことをすると問題なく動作します。 gtk.Layoutを使ってスクロールするのはかなり速いですが、gtk.DrawingAreaに描画することで手動でスクロールするのは(後で効果を追加したいかもしれませんが)完全に使用できなくなります。 – Grumbel

0

を使用して、それを画面に描画するには、いくつかのベンチマークをやって価値があるかもしれない - あなたは小面積で描くかどうかはまだ遅いですか?もしそうであれば、それはPyGTKのかgtkのメーリングリストに尋ねる価値があるかもしれ

...

関連する問題