WPF canvas performance- children.add appelé plusieurs fois

Je trace beaucoup de lignes sur un long canevas (pense à la bande) et je les ajuste assez bien pour la performance, en utilisant les classes de géomésortinge de bas niveau et en les gelant, etc. Cela améliore considérablement les performances, mais cela prend encore quelques secondes charger quelques milliers d’objects dans la canvas. J’ai effectué une parsing des performances sur l’application et il semble qu’un gros pourcentage du temps est pris par chaque appel à canvas.children.add() . J’ai lu que cela devrait être un appel léger, et comme je l’appelle de nombreuses fois avec une méthode, il ne devrait pas être d’essayer de faire quelque chose de lourd entre les deux … Peut-il y avoir une autre raison pour que cela prenne tellement de temps? Et puis-je accélérer les choses?

Les performances ne sont pas terribles, mais je crains que cela ne devienne un problème plus tard si je dois traiter de plus grands ensembles de données.

À titre de référence, il semble que cet échantillon s’appelle 1400 fois et prend environ 3 secondes de temps CPU sur un ordinateur portable moderne / rapide.

La canvas est contenue dans une hiérarchie d’autres contrôles, donc je suis curieux de savoir s’ils pourraient consortingbuer à cela.

Remarque supplémentaire: je ne définis pas non plus de hauteur spécifique sur le canevas, car il est défini pour remplir le conteneur parent de la grid. Cela pourrait-il être une source de problèmes?

Le problème principal est que Children.Add est toujours une opération lente, même si vous utilisez des objects StreamGeometry. J’ai rencontré le même problème récemment et ai conclu ce qui suit: Si vous placez un groupe d’objects dans une nouvelle zone de travail et que vous l’introduisez dans la zone de travail principale, les performances de l’opération d’addition seront considérablement améliorées. Ainsi, au lieu d’append 1400 éléments, placez 200 éléments dans 7 canvass et ajoutez-les à la canvas principale. Étant donné que tous les objects appartiennent maintenant à des canvass différentes, vous devrez ajuster légèrement votre application, mais ce serait une solution moins radicale que de passer à une solution alternative telle que DrawingVisual.

Juste pour append à propos de la hiérarchie des contrôles dans lesquels se trouve le canevas et de la hauteur du canevas:

le canevas prend toujours autant de place que ce qui lui est donné, et quels que soient les enfants que vous y ajoutez, il ne déclenche JAMAIS un nouveau transfert de Measuer / Arrange sur ses parents. Par conséquent, quoi que vous fassiez dans une canvas ne peut jamais affecter l’arbre visuel dans lequel elle est contenue. Pour résumer, le problème ne peut pas venir de là, et la suggestion au sujet de StreamGeomatry est tout à fait juste – c’est ce qui cause les problèmes de performances, et le passage à streamgeormatry le résoudrait.

Je suggérerais que vous dessiniez vos formes directement dans une image au lieu de les append en tant qu’enfants. Rendre les enfants a d’énormes frais généraux (comme vous pouvez le voir).

Il y a une question similaire avec une référence à des articles utiles:

Comment tracer une ligne de dix mille points avec WPF en moins de 0,5 seconde?