Optimalizace výkonu: Rozložení a návrh

Návrh aplikace WPF může ovlivnit jeho výkon vytvořením zbytečné režie při výpočtu rozložení a ověřování odkazů na objekty. Konstrukce objektů, zejména v době běhu, může ovlivnit charakteristiky výkonu vaší aplikace.

Toto téma poskytuje doporučení k výkonu v těchto oblastech.

Rozložení

Pojem "průchod rozložení" popisuje proces měření a uspořádání členů Panelkolekce podřízených objektů odvozených od objektu a pak je nakreslete na obrazovku. Předání rozložení je matematicky náročný proces – čím větší je počet podřízených položek v kolekci, tím větší je požadovaný počet výpočtů. Například pokaždé, když podřízený UIElement objekt v kolekci změní svou pozici, může aktivovat nový průchod systémem rozložení. Vzhledem k úzkému vztahu mezi vlastnostmi objektu a chováním rozložení je důležité pochopit typ událostí, které mohou vyvolat systém rozložení. Vaše aplikace bude fungovat lépe tím, že sníží co nejvíce případné zbytečné vyvolání průchodu rozložení.

Systém rozložení dokončí dva průchody pro každého podřízeného člena v kolekci: průchod míry a předání uspořádání. Každý podřízený objekt poskytuje vlastní přepsání Measure implementace a Arrange metod, aby poskytoval vlastní specifické chování rozložení. V nejjednodušším rozložení je rekurzivní systém, který vede k velikosti, umístění a vykreslení prvku na obrazovce.

  • Podřízený UIElement objekt zahájí proces rozložení tím, že nejprve změří jeho základní vlastnosti.

  • Vyhodnocují se vlastnosti objektu FrameworkElement , které souvisejí s velikostí, například Width, Heighta Margin.

  • Panel-specifická logika je použita, například Dock vlastnost DockPanel, nebo Orientation vlastnost StackPanel.

  • Obsah se uspořádá nebo umístí po měření všech podřízených objektů.

  • Kolekce podřízených objektů je nakreslena na obrazovku.

Proces předání rozložení se znovu vyvolá, pokud dojde k některé z následujících akcí:

  • Do kolekce se přidá podřízený objekt.

  • U podřízeného objektu se použije A LayoutTransform .

  • Metoda UpdateLayout je volána pro podřízený objekt.

  • Když dojde ke změně hodnoty vlastnosti závislosti, která je označena metadaty ovlivňující míru nebo uspořádání předá.

Použití nejúčinnějšího panelu tam, kde je to možné

Složitost procesu rozložení je přímo založena na chování rozložení -odvozených Panelprvků, které používáte. Například Grid ovládací StackPanel prvek poskytuje mnohem více funkcí než Canvas ovládací prvek. Cena za toto větší zvýšení funkčnosti je vyšší zvýšení nákladů na výkon. Pokud ale nepotřebujete funkce, které Grid ovládací prvek poskytuje, měli byste použít méně nákladné alternativy, například Canvas vlastní panel.

Další informace najdete v tématu Přehled panelů.

Aktualizovat místo nahrazení RenderTransform

Možná budete moct aktualizovat Transform místo toho, abyste ji nahradili hodnotou RenderTransform vlastnosti. To platí zejména ve scénářích, které zahrnují animaci. Aktualizací existujícího Transformsouboru zabráníte zahájení nepotřebného výpočtu rozložení.

Vytvoření stromu shora dolů

Při přidání nebo odebrání uzlu z logického stromu se u nadřazeného uzlu a všech podřízených objektů uzlu vyvolá zneplatnění vlastností. V důsledku toho by se měl vždy dodržovat vzor konstrukce shora dolů, aby se zabránilo nákladům na zbytečné zneplatnění na uzlech, které už byly ověřeny. Následující tabulka ukazuje rozdíl v rychlosti provádění mezi sestavením stromu shora dolů a dolů, kde strom je 150 úrovní hluboko s jednou TextBlock a DockPanel na každé úrovni.

Akce Stromová budova (v ms) Vykreslení – zahrnuje vytváření stromové struktury (v ms)
Zdola nahoru 366 454
Shora dolů 11 96

Následující příklad kódu ukazuje, jak vytvořit strom shora dolů.

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

Další informace o logickém stromu naleznete v tématu Stromy ve WPF.

Viz také