I pannelli che menzioni sono pannelli di layout, quindi una breve panoramica del sistema di layout suggerisce che probabilmente non sarà solo un semplice elenco del pannello più efficiente, ma come utilizzi i pannelli che hanno il maggiore effetto su efficienza e prestazioni.
LayoutSystem_Overview :
Nella sua forma più semplice, il layout è un sistema ricorsivo che porta a un elemento dimensionato, posizionato e disegnato. Più specificamente, il layout descrive il processo di misurazione e organizzazione dei membri della collezione Children di un elemento Panel. Il layout è un processo intenso. Maggiore è la raccolta Bambini, maggiore è il numero di calcoli che devono essere effettuati. La complessità può anche essere introdotta in base al comportamento del layout definito dall'elemento Panel proprietario della raccolta. Un pannello relativamente semplice, come Canvas, può avere prestazioni significativamente migliori rispetto a un pannello più complesso, come Grid.
Ogni volta che un UIElement figlio cambia posizione, ha il potenziale per innescare un nuovo passaggio dal sistema di layout. Pertanto, è importante comprendere gli eventi che possono invocare il sistema di layout, in quanto l'invocazione non necessaria può portare a scarse prestazioni dell'applicazione. Di seguito viene descritto il processo che si verifica quando viene invocato il sistema di layout.
1. Un UIElement figlio inizia il processo di layout misurando innanzitutto le sue proprietà principali.
2. Vengono valutate le proprietà di dimensionamento definite su FrameworkElement, come Larghezza, Altezza e Margine.
3. Viene applicata la logica specifica del pannello, come la direzione del dock o l'orientamento dello stacking.
4. Il contenuto è organizzato dopo che tutti i bambini sono stati misurati.
5. La raccolta Bambini viene disegnata sullo schermo.
6. Il processo viene nuovamente richiamato se alla raccolta vengono aggiunti ulteriori elementi secondari, viene applicato un LayoutTransform o viene chiamato il metodo UpdateLayout.
Vedere LayoutSystem_Measure_Arrange per ulteriori informazioni sulla misurazione e l'organizzazione dei bambini
LayoutSystem_Performance :
Il layout è un processo ricorsivo. Ogni elemento figlio in una raccolta Bambini viene elaborato durante ogni invocazione del sistema di layout. Di conseguenza, l'attivazione del sistema di layout dovrebbe essere evitata quando non è necessario. Le seguenti considerazioni possono aiutarti a ottenere prestazioni migliori.
Essere consapevoli di quali modifiche al valore della proprietà forzeranno un aggiornamento ricorsivo da parte del sistema di layout.
Le proprietà di dipendenza i cui valori possono causare l'inizializzazione del sistema di layout sono contrassegnate con flag pubblici. AffectsMeasure e AffectsArrange forniscono utili indicazioni su quali modifiche al valore della proprietà forzeranno un aggiornamento ricorsivo da parte del sistema di layout. In generale, qualsiasi proprietà che può influire sulla dimensione del rettangolo di selezione di un elemento dovrebbe avere un flag AffectsMeasure impostato su true. Per ulteriori informazioni, consultare Panoramica delle proprietà di dipendenza.
Se possibile, utilizzare un RenderTransform anziché un LayoutTransform.
Un LayoutTransform può essere un modo molto utile per influenzare il contenuto di un'interfaccia utente (UI). Tuttavia, se l'effetto della trasformazione non deve influire sulla posizione di altri elementi, è preferibile utilizzare invece RenderTransform, poiché RenderTransform non invoca il sistema di layout. LayoutTransform applica la sua trasformazione e impone un aggiornamento di layout ricorsivo per tenere conto della nuova posizione dell'elemento interessato.
Evita le chiamate non necessarie a UpdateLayout.
Il metodo UpdateLayout impone un aggiornamento del layout ricorsivo e spesso non è necessario. A meno che non si sia sicuri che sia necessario un aggiornamento completo, fare affidamento sul sistema di layout per chiamare questo metodo.
Quando lavori con una grande raccolta di bambini, prendi in considerazione l'utilizzo di un VirtualizingStackPanel invece di un normale StackPanel.
Virtualizzando la raccolta figlio, VirtualizingStackPanel mantiene solo gli oggetti in memoria che si trovano attualmente nel ViewPort del genitore. Di conseguenza, le prestazioni sono notevolmente migliorate nella maggior parte degli scenari.
Ottimizzazione delle prestazioni: layout e progettazione : questo articolo illustra in dettaglio come costruire l'albero in modo efficiente e fornisce un semplice elenco di pannelli in base alla loro complessità
Canvas (meno complext = prestazioni più efficienti e migliori)
Griglia
Altri pannelli (più complessi = prestazioni meno efficienti e peggiori)
Altre considerazioni sulle prestazioni a cui prestare attenzione: Modi per migliorare la velocità di rendering dell'interfaccia utente di WPF
- Metti tutto nella cache. Pennelli, colori, geometrie, testi formattati, glifi. (Ad esempio abbiamo due classi: RenderTools e TextCache. Il processo di rendering di ciascuna unità si indirizza all'istanza condivisa di entrambe le classi. Quindi, se due grafici hanno lo stesso testo, la sua preparazione viene eseguita una sola volta.)
- Congela Freezable, se hai intenzione di usarlo per molto tempo. Soprattutto le geometrie. Geometrie complesse non ventilate eseguono HitTest estremamente lentamente.
- Scegli i modi più veloci di rendering di ogni primitiva. Ad esempio, ci sono circa 6 modi di rendering del testo, ma il più veloce è DrawingContext.DrawGlyphs.
- Abilita riciclo container. La virtualizzazione offre molti miglioramenti delle prestazioni, ma i contenitori verranno eliminati e ricreati, questa è l'impostazione predefinita. Ma puoi ottenere maggiori prestazioni riciclando i contenitori impostando VirtualizingStackPanel.VirtualizationMode = "Riciclaggio"
- Da qui : non esiste un limite pratico alla quantità di annidamento supportata dall'applicazione, tuttavia è generalmente consigliabile limitare l'applicazione per utilizzare solo i pannelli effettivamente necessari per il layout desiderato. In molti casi, un elemento Grid può essere utilizzato al posto dei pannelli nidificati grazie alla sua flessibilità come contenitore di layout. Ciò può aumentare le prestazioni della tua applicazione mantenendo gli elementi non necessari fuori dalla struttura.