animazioni fluide utilizzando GTK +
Domanda
Sto creando un animatore di rete (simile a nam, se avete usato prima).
Fondamentalmente, ho nodi rappresentati come piccoli punti su una GTK + DrawingArea e aggiorno le posizioni di questi nodi e ridisegnare la DrawingArea in un ciclo.
L'animazione risultante è veloce, ma non liscia (c'è un sacco di sfarfallio). Questo è probabilmente perché io riempio il DrawingArea con un colore solido prima di ogni fotogramma.
Come pensi che io posso meglio affrontare questo problema? Devo pre-renderizzare le cornici Onto Pixbufs? C'è una soluzione migliore?
Ecco il mio codice di disegno corrente (utilizzando 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)
dove self.t
è l'ora corrente, che viene incrementato nel loop.
Soluzione
Ho cambiato il mio codice di rendere i fotogrammi SU UN Pixmap, e sostituito il DrawingArea con un'immagine.
Anche se questo ha risolto il flickering, ora l'utilizzo della CPU ha raggiunto l'apice. L'animazione è ancora abbastanza veloce, ma non credo che questo metodo è scalabile.
Ora per qualche ottimizzazione, immagino.
UPDATE: Si scopre utilizzando esporre-evento con un'immagine non è stata una buona idea. l'utilizzo della CPU è tornato alla normalità.
Altri suggerimenti
Informazioni sul dispositivo esporre-evento, controlla il primo paragrafo animazioni con il Cairo + Gtk: P
Animazione multi-threaded con Cairo e GTK +
animazioni complesse con cairo e GTK + può risultare in un'interfaccia lag. Questo perché il gtk_main () thread viene eseguito in un singolo ciclo. Quindi, se il vostro do_draw () funzione implementa un comando complicato disegno, ed è chiamato dal thread gtk_main () (dire da un on_window_expose_event () la funzione), il resto del codice GTK sarà bloccato fino a quando il do_draw () funzione termina. Di conseguenza, le voci di menu, mouse Clic, e anche stretti eventi dei pulsanti sarà lenta per essere elaborato e l'interfaccia si sentirà lag.Una soluzione è a portata di mano fuori tutto il disegno intensivo del processore di un thread separato, liberando così il filo gtk_main () per rispondere alle eventi.