Frage

Ich erstelle ein Netzwerk Animator (ähnlich nam, wenn Sie es verwendet haben).

Im Grunde genommen habe ich Knoten als kleine Punkte auf einem GTK + DrawingArea vertreten, und ich die Positionen dieser Knoten aktualisieren und den DrawingArea in einer Schleife neu gezeichnet werden.

Die resultierende Animation ist schnell, aber nicht glatt (es gibt eine Menge von Flimmern). Dies ist wahrscheinlich, weil ich den DrawingArea mit einer soliden Farbe vor jedem Rahmen zu füllen.

Wie denken Sie, ich am besten dieses Problem angehen kann? Soll ich den Rahmen auf Pixbufs vorrendern? Gibt es eine bessere Lösung?

Hier ist meine aktuelle Zeichnung Code (mit 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)

wobei self.t die aktuelle Zeit, die in der Schleife erhöht wird.

War es hilfreich?

Lösung

änderte ich meinen Code den Rahmen auf eine Pixmap und ersetzt die DrawingArea mit einem Bild.

zu machen

Während dies das Flackern gelöst, nun die CPU-Auslastung hat ihren Höhepunkt erreicht. Die Animation ist immer noch recht schnell, aber ich glaube nicht, das Verfahren skalierbar ist.

Zeit für einige Optimierung, denke ich.

UPDATE: Es stellt sich heraus mit belichten-Ereignisse mit einem Bild wurde nicht so eine gute Idee. CPU-Auslastung ist wieder normal.

Andere Tipps

über die belichten-Event-Handling, überprüfen Sie den ersten Absatz auf Animationen mit Kairo + Gtk out: P

  

Multi-Threaded-Animation mit Kairo und GTK +
  Komplexe Animationen mit   kairo und GTK + in einer laggy Schnittstelle führen. Dies liegt daran, die   gtk_main () Gewinde läuft in einer einzigen Schleife. Also, wenn Ihr do_draw ()   Funktion implementiert eine komplizierte Zeichnung Befehl ein, und es wird aufgerufen,   vom gtk_main () Gewinde (sagen wir von einem on_window_expose_event ()   Funktion), wird der Rest des GTK-Code, bis die blockiert werden   do_draw () Funktion beendet. Konsequenter, Menüpunkte, Maus   Klicks und sogar Schließen-Schaltfläche Ereignisse werden langsam zu verarbeiten und   Ihre Oberfläche wird laggy fühlen.

     

Eine Lösung ist es, alle rechenintensiven Zeichnung ein zu übergeben   separater Thread, wodurch die gtk_main () Gewinde zu befreien, um zu reagieren,   Veranstaltungen.

http://cairographics.org/threaded_animation_with_cairo/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top