2009-08-28 8 views
3

Actuellement, j'utilise un System.Windows.Media.DrawingGroup pour stocker des images en mosaïque (ImageDrawing) dans la propriété Children-DrawingCollection. Eh bien, le problème est maintenant, cette méthode devient très lente si vous affichez l'ensemble DrawingGroup dans un contrôle Image, parce que mon DrawingGroup peut contenir des centaines ou même des milliers de petites images, il peut vraiment gâcher la performance. Donc, ma première pensée était de rendre en quelque sorte une seule image de toutes les petites images à l'intérieur du DrawingGroup et ensuite seulement afficher cette image, ce serait beaucoup plus rapide. Mais comme vous l'avez peut-être compris, je n'ai trouvé aucune solution, il suffit donc de combiner plusieurs images avec WPF Imaging.Rendu de WPF DrawingGroup en single ImageSource

Ce serait vraiment bien si quelqu'un pouvait aider avec ce problème ou me dire comment je peux améliorer les performances avec DrawingGroup ou même utiliser une autre approche. Une dernière chose, actuellement j'utilise un RenderTargetBitmap pour générer une seule BitmapSource à partir du DrawingGroup, cette approche n'est pas vraiment plus rapide, mais elle rend le défilement et le travail sur le contrôle Image au moins un peu plus fluide.

Répondre

1

Je travaille sur un problème lié aux images en mosaïque, avec la complication supplémentaire d'avoir à afficher certaines images superposées sur d'autres.

Je n'ai pas rencontré de problèmes de performances (et probablement pas depuis que mes images sont plutôt petites et relativement petites, environ 100 max.), Mais j'ai rencontré la méthode Freeze dans un échantillon de code pour la classe DrawingImage. Le commentaire pour cela était "Freeze the DrawingImage pour les avantages de performance."

La méthode Freeze s'applique également à la classe DrawingGroup. Peut-être essayer?

2

Je ne suis pas sûr que cela s'applique à votre problème, mais je vais le poster ici de toute façon, car il pourrait aider quelqu'un:

Si toutes les images du groupe de dessin va être visible au En même temps, vous pouvez définir la propriété ClipGeometry comme vous le souhaitez. Cela indique à WPF que les parties en dehors de la géométrie ne sont pas nécessaires et seront ignorées lors du rendu.

Quelques autres choses que vous pourriez expérimenter sont:

  • Freeze le drawinggroup avant de l'appliquer à votre source d'image. Au moins cela ne pourrait pas faire de mal (sauf si vous avez vraiment besoin de modifier l'instance, mais souvenez-vous que vous pourriez toujours en créer un nouveau au lieu de modifier l'ancien)
  • Essayez différentes façons d'afficher votre groupe de dessin. Par exemple en tant que DrawingVisual (qui est considéré comme léger) ou en tant que DrawingBrush pour peindre par ex. un rectangle.
  • Combinez les petites images en plus petits groupes que vous combinez ensuite à votre plus grand groupe. Aucune idée si cela améliore ou blesse la performance, mais cela pourrait valoir la peine d'essayer.