Megosztás a következőn keresztül:


A teljesítmény optimalizálása: Elrendezés és tervezés

A WPF-alkalmazás tervezése hatással lehet a teljesítményére azáltal, hogy szükségtelen többletterhelést okoz az elrendezés kiszámításában és az objektumhivatkozások érvényesítésében. Az objektumok felépítése, különösen futásidőben, hatással lehet az alkalmazás teljesítményjellemzőire.

Ez a témakör teljesítményjavaslatokat tartalmaz ezeken a területeken.

Elrendezés

A "layout pass" kifejezés azt a folyamatot jelöli, amely során egy Panel-származtatott objektum gyermekelemeit lemérik és elrendezik, majd megjelenítik a képernyőn. Az elrendezési átadás matematikailag intenzív folyamat – minél nagyobb a gyűjteményben lévő gyermekek száma, annál nagyobb a szükséges számítások száma. Például minden alkalommal, amikor egy gyermek UIElement objektum a gyűjteményben megváltoztatja a pozícióját, lehetősége van arra, hogy az elrendezési rendszer új pass-t aktiváljon. Az objektum jellemzői és az elrendezés viselkedése közötti szoros kapcsolat miatt fontos megérteni, hogy milyen típusú események hívhatják meg az elrendezési rendszert. Az alkalmazás jobban teljesít, ha a lehető legnagyobb mértékben csökkenti az elrendezési futások szükségtelen meghívásait.

Az elrendezési rendszer két fázist hajt végre a gyűjtemény minden gyermektagja esetében: egy mérési fázist és egy elrendezési fázist. Minden gyermekobjektum saját felülbírált implementációt biztosít a Measure és Arrange metódusok számára, hogy saját elrendezési viselkedést biztosítson. A legegyszerűbb elrendezés egy rekurzív rendszer, amely egy méretezhető, elhelyezett és a képernyőn rajzolt elemet eredményez.

  • A gyermek UIElement objektum először az alaptulajdonságainak mérésével kezdi meg az elrendezési folyamatot.

  • A rendszer kiértékeli az objektum mérethez kapcsolódó FrameworkElement tulajdonságait, például Width, Heightés Margin.

  • Panel-specifikus logikát alkalmazunk, például a DockDockPanel tulajdonságát vagy a OrientationStackPanel tulajdonságát.

  • A tartalom elrendezése vagy elhelyezése az összes gyermekobjektum mérése után történik.

  • A gyermekobjektumok gyűjteménye a képernyőre kerül.

Az elrendezés-átadási folyamat újra meghívódik, ha a következő műveletek bármelyike történik:

  • A rendszer hozzáad egy gyermekobjektumot a gyűjteményhez.

  • A rendszer egy LayoutTransform alkalmaz a gyermekobjektumra.

  • A UpdateLayout metódust a gyermekobjektumra hívják meg.

  • Amikor egy függőségi tulajdonság értékében bekövetkező változás olyan metaadatokkal van megjelölve, amelyek befolyásolják a mérési vagy elrendezési folyamatokat.

A leghatékonyabb panel használata, ahol lehetséges

Az elrendezési folyamat összetettsége közvetlenül a használt Panelszármaztatott elemek elrendezési viselkedésén alapul. Egy Grid vagy StackPanel vezérlő például sokkal több funkciót biztosít, mint egy Canvas vezérlőelem. Ennek a funkciónövekedésnek az ára a teljesítményköltségek nagyobb mértékű növekedése. Ha azonban nincs szüksége a Grid vezérlő által biztosított funkciókra, akkor a kevésbé költséges alternatívákat kell használnia, például egy Canvas vagy egy egyéni panelt.

További információ: Panelek áttekintése.

A RenderTransform cseréje helyett annak frissítése

Előfordulhat, hogy frissíthet egy Transform-t, ahelyett, hogy RenderTransform tulajdonság értékeként cserélné le. Ez különösen igaz az animációs forgatókönyvekre. Meglévő Transformfrissítésével elkerülheti a szükségtelen elrendezésszámítást.

Építsd meg a fádat Top-Down

Amikor egy csomópontot hozzáadnak vagy eltávolítanak a logikai fáról, tulajdonság-érvénytelenítések történnek a csomópont szülőjén és annak összes gyermekén. Ennek eredményeképpen mindig felülről lefelé építkező mintát kell követni, hogy elkerülhető legyen a szükségtelen érvénytelenítések költsége a már ellenőrzött csomópontokon. Az alábbi táblázat azt mutatja be, hogy mi a különbség a végrehajtási sebességben a fa felülről lefelé és alulról felfelé történő felépítése között, ahol a fa 150 szint mély, egyetlen TextBlock és DockPanel minden szinten.

Akció faépítés (ms) Render—tartalmazza a faépítést (ms)
Alulról felfelé 366 454
Felülről lefelé 11 96

Az alábbi példakód bemutatja, hogyan hozhat létre lefelé egy fát.

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

További információ a logikai fáról az alábbi hivatkozásnál található: Fák a WPF.

Lásd még