2009-06-06 7 views
8

मेरे पास एक छवि/पिक्सबफ है जिसे मैं gtk.DrawingArea में आकर्षित करना चाहता हूं और अक्सर ताज़ा करता हूं, इसलिए ब्लिटिंग ऑपरेशन तेज़ होना चाहिए।जीटीके + में एक छवि खींचने का सबसे तेज़ तरीका क्या है?

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) 

हालांकि बहुत धीमी गति से प्रदर्शन, संभावना जरूर प्रदर्शित करता है रंग प्रारूप में नहीं किया जा रहा की वजह से की ओर जाता है: यह आसान तरीका कर रहा।

मुझे कैरो के साथ कोई सफलता नहीं मिली, क्योंकि यह 24/32 बिट प्रारूपों तक सीमित है और इसमें 16 बिट प्रारूप नहीं है (FORMAT_RGB16_565 असमर्थित और बहिष्कृत है)।

Gtk + में चित्रों को चित्रित करने के लिए क्या विकल्प हैं?

उत्तर

6

पिक्समैप बनाने का प्रयास करें जो आपके ड्राइंग क्षेत्र के समान रंगमंच का उपयोग करता है।

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

यह प्रवाह झिलमिलाते नहीं है। मैं ओएलपीसी पर कुछ इंटरैक्टिव फुलस्क्रीन स्क्रॉलिंग/एनिमशन करने की कोशिश कर रहा हूं, जो शुरू करने के लिए बहुत तेज नहीं है और इसके शीर्ष पर एक बड़ी स्क्रीन है और यह 16 बिट में चलता है। एसडीएल में एक ही चीज़ करना बिना किसी समस्या के काम करता है। Gtk.Layout का उपयोग करना और स्क्रॉलिंग के लिए इसका उपयोग करना काफी तेज़ है, लेकिन gtk.DrawingArea (जैसा कि मैं बाद में अधिक प्रभाव जोड़ना चाहता हूं) पर ड्रैग करके स्क्रॉलिंग मैन्युअल रूप से कर रहा हूं पूरी तरह से अनुपयोगी धीमी है। – Grumbel

0

का उपयोग कर यह कुछ बेंच मार्किंग कर लायक हो सकता है के लिए ड्राइंग - अगर आप एक छोटे से क्षेत्र के साथ आकर्षित यह अभी भी धीमी है?

अगर ऐसा है, यह PyGTK या जीटीके मेलिंग सूची पर पूछ लायक हो सकता है ...