سؤال

أقوم بإنشاء رسام متحرك للشبكة (يشبه NAM، إذا كنت قد استخدمته من قبل).

في الأساس، لدي العقد ممثلة كنقارات صغيرة على رسم GTK + رسميا، وأنت تحديث مواقف هذه العقد وإعادة رسم الرسم في حلقة.

الرسوم المتحركة الناتجة سريعة، ولكنها ليست سلسة (هناك الكثير من وميض). ربما هذا لأنني ملء الرسم مع لون صلب قبل كل إطار.

كيف تعتقد أنني أفضل معالجة هذه المشكلة؟ هل يجب علي تقديم الإطارات على pixbufs؟ هل هناك حل أفضل؟

إليك رمز الرسم الحالي (باستخدام Pygtk):

rect  = self.drawing_area.get_allocation()
style = self.drawing_area.get_style()

pos   = [n.position_at(self.t) for n in self.nodes]

self.drawing_area.window.draw_rectangle(style.bg_gc[gtk.STATE_NORMAL], True,
                                        0, 0, rect.width, rect.height)

for p in pos:
    self.drawing_area.window.draw_arc(style.fg_gc[gtk.STATE_NORMAL], True,
                                      rect.width  * (p.x / 2400.0) - NODE_SIZE/2,
                                      rect.height * (p.y / 2400.0) - NODE_SIZE/2,
                                      NODE_SIZE, NODE_SIZE,
                                      0, 64 * 360)

أين self.t هو الوقت الحالي، الذي يزيد في الحلقة.

هل كانت مفيدة؟

المحلول

لقد غيرت التعليمات البرمجية الخاصة بي لتقديم الإطارات على pixmap، واستبدل الرسم مع صورة.

في حين أن هذا حل الخفقان، فإن استخدام وحدة المعالجة المركزية الآن قد بلغ ذروته. لا تزال الرسوم المتحركة سريعة جدا، لكنني لا أعتقد أن هذه الطريقة قابلة للتحجيم.

الوقت لبعض التحسين، أعتقد.

تحديث: اتضح باستخدام حدث Expose مع صورة لم تكن فكرة جيدة. استخدام وحدة المعالجة المركزية عاد إلى طبيعته.

نصائح أخرى

حول التعامل مع فاشل الحدث، تحقق من الفقرة الأولى على الرسوم المتحركة مع القاهرة + GTK: P

الرسوم المتحركة متعددة الخيوط مع القاهرة و GTK +
يمكن أن يؤدي الرسوم المتحركة المعقدة مع القاهرة و GTK + إلى واجهة LAGGY. وذلك لأن مؤشر ترابط GTK_MAIN () يعمل في حلقة واحدة. لذلك، إذا كانت الدالة DO_DRAW () تنفذ أمر رسم معقوف، ويطلق عليه من مؤشر ترابط GTK_MAIN () (Say بواسطة وظيفة on_window_expose_event ()، سيتم حظر بقية رمز GTK الخاص بك حتى تنتهي وظيفة DO_DRAW () وبعد وبالتالي، فإن عناصر القائمة، ونقرات الماوس، وحتى أحداث زر إغلاق ستكون بطيئة في معالجة وستشعر واجهةك باختصار.

أحد الحلول هو تسليم جميع الرسم المكثف المعالج إلى مؤشر ترابط منفصل، وبالتالي تحرير مؤشر ترابط GTK_MAIN () للرد على الأحداث.

http://cairographics.org/threaded_animation_with_cairo/

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top