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