Condividi tramite


Ottimizzazione delle prestazioni: layout e progettazione

La progettazione dell'applicazione WPF può influire sulle prestazioni creando un sovraccarico non necessario nel calcolo del layout e nella convalida dei riferimenti agli oggetti. La costruzione di oggetti, in particolare in fase di esecuzione, può influire sulle caratteristiche delle prestazioni dell'applicazione.

In questo argomento vengono fornite indicazioni sulle prestazioni in queste aree.

Impaginazione

Il termine "passaggio di layout" descrive il processo di misurazione e disposizione degli oggetti figli di una raccolta derivata da un oggetto di tipo Panel, per poi renderizzarli sullo schermo. Il passaggio di layout è un processo a elevato utilizzo matematico, ovvero maggiore è il numero di elementi figlio nella raccolta, maggiore è il numero di calcoli necessari. Ad esempio, ogni volta che un oggetto figlio UIElement nell'insieme modifica la posizione, può attivare un nuovo passaggio dal sistema di layout. A causa della stretta relazione tra le caratteristiche dell'oggetto e il comportamento del layout, è importante comprendere il tipo di eventi che possono richiamare il sistema di layout. L'applicazione migliorerà riducendo il più possibile le chiamate non necessarie del passaggio di layout.

Il sistema di layout completa due passaggi per ogni membro figlio in una raccolta: un passaggio di misura e un passaggio di disposizione. Ogni oggetto figlio fornisce la propria implementazione sottoposta a override dei Measure metodi e Arrange per fornire il proprio comportamento di layout specifico. Al suo modo più semplice, il layout è un sistema ricorsivo che porta a un elemento ridimensionato, posizionato e disegnato sullo schermo.

  • Un oggetto figlio UIElement inizia il processo di layout facendo prima misurare le sue proprietà fondamentali.

  • Le proprietà dell'oggetto FrameworkElement correlate alle dimensioni, ad esempio Width, Heighte Margin, vengono valutate.

  • PanelViene applicata una logica specifica, ad esempio la Dock proprietà dell'oggetto DockPanelo la Orientation proprietà dell'oggetto StackPanel.

  • Il contenuto viene disposto o posizionato dopo che tutti gli oggetti figlio sono stati misurati.

  • La raccolta di oggetti figlio viene disegnata sullo schermo.

Il processo di passaggio del layout viene richiamato di nuovo se si verifica una delle azioni seguenti:

  • Un oggetto figlio viene aggiunto alla collezione.

  • Un LayoutTransform viene applicato all'oggetto figlio.

  • Il metodo UpdateLayout viene chiamato per l'oggetto figlio.

  • Quando si verifica una modifica al valore di una proprietà di dipendenza contrassegnata con i metadati che influiscono sui processi di misurazione o disposizione.

Usare il pannello più efficiente dove possibile

La complessità del processo di layout si basa direttamente sul comportamento di layout degli elementi derivati da Panel che utilizzi. Ad esempio, un Grid controllo o StackPanel fornisce molte più funzionalità rispetto a un Canvas controllo . Il prezzo di questo aumento maggiore di funzionalità è un aumento maggiore dei costi di prestazioni. Tuttavia, se non è necessaria la funzionalità fornita da un Grid controllo, è consigliabile usare le alternative meno costose, ad esempio un Canvas pannello personalizzato o .

Per ulteriori informazioni, vedere la Panoramica dei pannelli .

Aggiornare anziché sostituire un oggetto RenderTransform

È possibile aggiornare un oggetto Transform anziché sostituirlo come valore di una RenderTransform proprietà. Ciò è particolarmente vero negli scenari che coinvolgono l'animazione. Aggiornando un oggetto esistente Transform, si evita di avviare un calcolo di layout non necessario.

Costruisci il tuo albero Top-Down

Quando un nodo viene aggiunto o rimosso dall'albero logico, le invalidazioni delle proprietà vengono generate nell'elemento padre del nodo e in tutti i relativi elementi figlio. Di conseguenza, è consigliabile seguire sempre un modello di costruzione dall'alto verso il basso per evitare il costo di invalidazioni non necessarie nei nodi che sono già stati convalidati. La tabella seguente mostra la differenza nella velocità di esecuzione tra la costruzione di un albero dall'alto in basso e dal basso verso l'alto, dove l'albero ha una profondità di 150 livelli con un singolo TextBlock e DockPanel a ogni livello.

azione Costruzione dell'albero (in ms) Rendering: include la costruzione dell'albero (in ms)
Dal basso verso l'alto 366 454
Dall'alto in basso 11 96

Nell'esempio di codice seguente viene illustrato come creare un albero dall'alto verso il basso.

private void OnBuildTreeTopDown(object sender, RoutedEventArgs e)
{
    TextBlock textBlock = new TextBlock();
    textBlock.Text = "Default";

    DockPanel parentPanel = new DockPanel();
    DockPanel childPanel;

    myCanvas.Children.Add(parentPanel);
    myCanvas.Children.Add(textBlock);

    for (int i = 0; i < 150; i++)
    {
        textBlock = new TextBlock();
        textBlock.Text = "Default";
        parentPanel.Children.Add(textBlock);

        childPanel = new DockPanel();
        parentPanel.Children.Add(childPanel);
        parentPanel = childPanel;
    }
}
Private Sub OnBuildTreeTopDown(ByVal sender As Object, ByVal e As RoutedEventArgs)
    Dim textBlock As New TextBlock()
    textBlock.Text = "Default"

    Dim parentPanel As New DockPanel()
    Dim childPanel As DockPanel

    myCanvas.Children.Add(parentPanel)
    myCanvas.Children.Add(textBlock)

    For i As Integer = 0 To 149
        textBlock = New TextBlock()
        textBlock.Text = "Default"
        parentPanel.Children.Add(textBlock)

        childPanel = New DockPanel()
        parentPanel.Children.Add(childPanel)
        parentPanel = childPanel
    Next i
End Sub

Per altre informazioni sull'albero logico, vedere Trees in WPF.

Vedere anche