Partager via


Optimisation des performances : disposition et conception

Mise à jour : novembre 2007

La conception de votre application WPF peut affecter ses performances en créant des charges mémoire inutiles pour calculer la disposition et valider des références d'objet. La construction d'objets, en particulier au moment de l'exécution, peut affecter les caractéristiques de performance de votre application.

Cette rubrique fournit des recommandations de performance dans ces domaines.

Disposition

Le terme « passe de disposition » décrit le processus consistant à mesurer et à disposer les membres d'une collection d'enfants de l'objet dérivé de Panel, et à les dessiner ensuite à l'écran. Le passe de disposition est un processus mathématique intensif (plus le nombre d'enfants est élevé dans la collection, plus le nombre de calculs requis est grand). Par exemple, à chaque fois qu'un objet UIElement enfant dans la collection modifie sa position, il a la possibilité de déclencher une nouvelle passe par le système de disposition. Étant donné que la relation entre les caractéristiques d'objet et le comportement de disposition est étroite, il est important de comprendre le type des événements qui peuvent appeler le système de disposition. Votre application sera plus performante si vous réduisez autant que possible tous les appels inutiles de la passe de disposition.

Le système de disposition effectue deux passes pour chaque membre enfant d'une collection , une passe de mesure et une passe de disposition. Chaque objet enfant dispose de sa propre implémentation substituée des méthodes Measure et Arrange pour fournir son propre comportement de disposition spécifique. Dans sa forme la plus simple, la disposition est un système récursif qui conduit au dimensionnement, positionnement et dessin d'un élément à l'écran.

  • Un objet UIElement enfant commence le processus de disposition en ayant en premier ses propriétés principales mesurées.

  • Les propriétés FrameworkElement de l'objet liées à la taille, telles que Width, Height et Margin, sont évaluées.

  • La logique spécifique à Panel est appliquée, telle que la propriété Dock du DockPanel, ou la propriété Orientation du StackPanel.

  • Le contenu est disposé, ou positionné, après que tous les objets enfants ont été mesurés.

  • La collection d'objets enfants est dessinée à l'écran.

Le processus de la passe de disposition est encore appelé si l'une des actions suivantes se produit :

  • Un objet enfant est ajouté à la collection.

  • Un LayoutTransform est appliqué à l'objet enfant.

  • La méthode UpdateLayout est appelée pour l'objet enfant.

  • Lorsqu'une modification est apportée à la valeur d'une propriété de dépendance qui est marquée avec les métadonnées affectant les passes de mesure ou de disposition.

Utiliser le panneau le plus efficace si possible

La complexité du processus de disposition est directement basé sur le comportement de disposition des éléments dérivés de Panel que vous utilisez. Par exemple, un contrôle Grid ou StackPanel fournit beaucoup plus de fonctionnalités qu'un contrôle Canvas. Le prix de ces fonctionnalités supérieures est une augmentation des coûts de performance. Toutefois, si vous n'avez pas besoin des fonctionnalités qu'un contrôle Grid fournit, vous devez utiliser les alternatives moins chères, telles qu'un Canvas ou un panneau personnalisé.

Pour plus d'informations, consultez Vue d'ensemble de Panel.

Mettre à jour plutôt que remplacer un RenderTransform

Vous êtes peut-être en mesure de mettre à jour un Transform plutôt que de le remplacer comme valeur d'une propriété RenderTransform. C'est notamment le cas dans des scénarios qui impliquent une animation. En mettant à jour un Transform existant, vous évitez d'initialiser un calcul de disposition inutile.

Générer votre arborescence Haut-Bas

Lorsqu'un nœud est ajouté ou supprimé de l'arborescence logique, les invalidations de propriété sont déclenchées sur le parent du nœud et tous ses enfants. En conséquence, un modèle de construction de haut en bas doit toujours être suivi pour éviter le coût d'invalidations inutiles sur les nœuds qui ont déjà été validés. La table suivante affiche la différence de vitesse d'exécution entre la génération d'une arborescence haut-bas et bas-haut, dans laquelle l'arborescence comprend 150 niveaux avec un TextBlock et un DockPanel à chaque niveau.

Action

Construction d'arborescence (en ms)

Rendu, y compris la construction d'arborescence (en ms)

Ascendante

366

454

Haut-bas

11

96

L'exemple de code suivant illustre la création d'une arborescence de haut en bas.

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;
    }
}

Pour plus d'informations sur l'arborescence logique, consultez Arborescences dans WPF.

Voir aussi

Concepts

Optimisation des performances des applications WPF

Planification des performances des applications

Optimisation des performances : tirer parti du matériel

Optimisation des performances : graphiques 2D et acquisition d'images

Optimisation des performances : comportement d'objets

Optimisation des performances : ressources d'application

Optimisation des performances : texte

Optimisation des performances : liaison de données

Optimisation des performances : autres recommandations

Ressources et outils d'analyse des performances WPF

Système de disposition