2009-11-23 1 views

risposta

34

Dopo aver acquisito un po 'più esperienza in questo campo da quando ho posto la domanda, risponderò a me stesso. La mia esperienza viene dal lavorare sul WPF applicazione mind mapping NovaMind - Abbiamo fatto un sacco di animazioni ultimamente per il nostro Presenter feature in NovaMind Platinum :-)

La sezione di MSDN sull'ottimizzazione delle prestazioni delle applicazioni WPF ha alcune informazioni utili su considerazioni di carattere generale durante la scrittura WPF applicazioni:

http://msdn.microsoft.com/en-us/library/aa970683.aspx

Qui ci sono alcuni pezzi che ho trovato particolarmente utile e sono legati all'animazione:

  • L'evento CompositionTarget.Rendering fa in modo che WPF si animi continuamente. Se si utilizza questo evento, staccarlo in ogni occasione.

  • Quando si utilizza un pennello per impostare il riempimento o il tratto di un elemento, è meglio impostare il valore Brush.Opacity piuttosto che l'impostazione della proprietà Opacity dell'elemento. La modifica della proprietà Opacity di un elemento può causare a WPF la creazione di una superficie temporanea.

  • Potrebbe essere possibile aggiornare una trasformazione anziché sostituirla con il valore di una proprietà RenderTransform. Questo è particolarmente vero negli scenari che coinvolgono l'animazione. Con l'aggiornamento di una trasformazione esistente, si evita l'avvio di un calcolo del layout non necessario.

Ecco quello che ho imparato attraverso tentativi ed errori:

  1. Dire, avete un paio di elementi con un effetto così come applicato il BlurEffect. È modo più veloce per applicare l'effetto al contenitore di questi elementi piuttosto che agli elementi stessi. Anche se l'effetto è accelerato dall'hardware, WPF non sembra essere bravo a gestire un numero di piccoli oggetti con effetti. - Se non vuoi lo stesso raggio di sfocatura e non puoi raggrupparli in un contenitore con l'effetto applicato, è più veloce renderizzare l'elemento in una bitmap (nel software) e quindi animare la bitmap (se possibile) . Avere effetti (o opacità per quella materia) sugli oggetti uccide rapidamente le prestazioni durante l'animazione.
  2. L'impostazione dell'opacità sul pennello piuttosto che sull'elemento (come indicato sopra) comporta un'enorme differenza di prestazioni durante l'animazione degli oggetti.
  3. Mantieni il numero di elementi visivi verso il basso. L'animazione di un gran numero di particelle è difficile, anche con i suggerimenti di cui sopra. In questo caso potrebbe essere necessario tornare a WriteableBitmap.

Ho anche sentito che è più veloce eseguire il rendering di molti piccoli oggetti sovrascrivendo OnRender nel contenitore e quindi renderli utilizzando il disegnoContext anziché aggiungerli direttamente all'albero visivo. In pratica, questo non ha fatto alcuna differenza nel mio scenario (quando si eseguono rendering di circa 300 geometrie dell'ellisse) ma potrebbe essere utile in alcuni scenari. La teoria sembra solida.

Infine, ho trovato le classi di animazione incorporate in WPF troppo ingombranti e molto più divertenti e di successo utilizzando il perdente delle librerie di animazioni: Artefact Animator. Seriamente, provalo.(è disponibile anche per Silverlight) È come dovrebbe essere stato l'animazione (nel codice).

Tuttavia non tutto è arcobaleni e unicorni. Trovo ancora impossibile creare animazioni veramente fluide quando si esegue a schermo intero con risoluzioni più elevate. Altro su questo nella mia domanda How to know why an animation stutters? - Gradirei qualsiasi input su quello.

evviva, buona fortuna e se hai qualcosa di interessante da mostrare, fammi sapere :)