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.

È stato utile?

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.

http://cairographics.org/threaded_animation_with_cairo/

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top