Optimieren der Leistung: 2D-Grafiken und Bildverarbeitung
WPF bietet eine breite Palette von 2D-Grafiken und Bildbearbeitungsfunktionen, die an die Anforderungen Ihrer Anwendung optimiert werden können. Dieses Thema enthält Informationen zur Leistungsoptimierung in diesen Bereichen.
Zeichnen und Formen
WPF stellt sowohl Drawing- als auch Shape-Objekte bereit, um grafische Zeichnungsinhalte darzustellen. Drawing Objekte sind jedoch einfachere Konstrukte als Shape Objekte und bieten bessere Leistungsmerkmale.
Mit einem Shape kannst du eine grafische Form auf den Bildschirm zeichnen. Da sie von der FrameworkElement-Klasse abgeleitet werden, können Shape-Objekte in Panels und den meisten Steuerelementen verwendet werden.
WPF bietet mehrere Ebenen des Zugriffs auf Grafik- und Renderingdienste. Auf der oberen Ebene sind Shape Objekte einfach zu verwenden und bieten viele nützliche Features, z. B. Layout- und Ereignisbehandlung. WPF stellt verschiedene vorgefertigte Shape-Objekte zur Verfügung. Alle Shape-Objekte erben von der Shape-Klasse. Verfügbare Shape-Objekte sind Ellipse, Line, Path, Polygon, Polylineund Rectangle.
Drawing-Objekte hingegen werden nicht von der FrameworkElement-Klasse abgeleitet und bieten eine einfachere Implementierung zum Rendern von Formen, Bildern und Texten.
Es gibt vier Arten von Drawing-Objekten:
GeometryDrawing Zeichnet eine Form.
ImageDrawing Zeichnet ein Bild.
GlyphRunDrawing Zeichnet Text.
DrawingGroup zeichnet andere Zeichnungen. Verwenden Sie eine Zeichnungsgruppe, um andere Zeichnungen in einer einzigen zusammengesetzten Zeichnung zu kombinieren.
Das GeometryDrawing-Objekt wird zum Rendern von geometrischen Inhalten verwendet. Die Geometry-Klasse und die von ihr abgeleiteten konkreten Klassen wie CombinedGeometry, EllipseGeometry und PathGeometry ermöglichen das Rendern von 2D-Grafiken und bieten Unterstützung für Treffertests und Clipping. Geometrieobjekte können verwendet werden, um den Bereich eines Steuerelements zu definieren, z. B. oder um den Clipbereich zu definieren, der auf ein Bild angewendet werden soll. Geometrieobjekte können einfache Bereiche sein, z. B. Rechtecke und Kreise oder zusammengesetzte Bereiche, die aus zwei oder mehr Geometrieobjekten erstellt wurden. Komplexere geometrische Bereiche können erstellt werden, indem man aus PathSegmentabgeleitete Objekte wie ArcSegment, BezierSegmentund QuadraticBezierSegmentkombiniert.
Auf der Oberfläche sind die Geometry Klasse und die Shape Klasse ähnlich. Beide werden beim Rendern von 2D-Grafiken verwendet und haben beide ähnliche konkrete Klassen, die von ihnen abgeleitet werden, z. B. EllipseGeometry und Ellipse. Es gibt jedoch wichtige Unterschiede zwischen diesen beiden Klassengruppen. Zum einen fehlt der Geometry Klasse einige der Funktionen der Shape Klasse, z. B. die Fähigkeit, sich selbst zu zeichnen. Um ein Geometrieobjekt zu zeichnen, muss eine andere Klasse wie DrawingContext, Drawing oder ein Path (es ist erwähnenswert, dass ein Path eine Form ist) zum Ausführen des Zeichnungsvorgangs verwendet werden. Darstellungseigenschaften wie Füllung, Kontur und Konturstärke befinden sich in der Klasse, die das Geometrieobjekt zeichnet, während ein Formobjekt diese Eigenschaften enthält. Eine Möglichkeit, sich diesen Unterschied zu vorstellen, besteht darin, dass ein Geometrieobjekt einen Bereich definiert, z. B. einen Kreis, während ein Shape-Objekt einen Bereich definiert, definiert, wie dieser Bereich gefüllt und umrissen wird und an dem Layoutsystem teilnimmt.
Da Shape Objekte von der FrameworkElement Klasse abgeleitet sind, kann die Verwendung in Ihrer Anwendung deutlich mehr Arbeitsspeicher verbrauchen. Wenn Sie die FrameworkElement Features für Ihre grafischen Inhalte wirklich nicht benötigen, sollten Sie die Verwendung der leichteren Drawing Objekte in Betracht ziehen.
Weitere Informationen zu Drawing-Objekten finden Sie unter Übersicht über Drawing-Objekte.
StreamGeometry-Objekte
Das StreamGeometry-Objekt ist eine einfache Alternative zu PathGeometry zum Erstellen geometrischer Formen. Verwenden Sie eine StreamGeometry, wenn Sie eine komplexe Geometrie beschreiben müssen. StreamGeometry ist für die Verarbeitung von vielen PathGeometry-Objekten optimiert und erzielt im Vergleich zu vielen einzelnen PathGeometry-Objekten eine bessere Leistung.
Im folgenden Beispiel wird mithilfe der Attributsyntax ein dreieckiges StreamGeometry-Element in XAML erstellt.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel>
<Path Data="F0 M10,100 L100,100 100,50Z"
StrokeThickness="1" Stroke="Black"/>
</StackPanel>
</Page>
Weitere Informationen zu den StreamGeometry-Objekten finden Sie unter Erstellen einer Form mithilfe einer StreamGeometry.
DrawingVisual-Objekte
Das DrawingVisual-Objekt ist eine einfache Zeichnungsklasse, die zum Rendern von Formen, Bildern oder Text verwendet wird. Diese Klasse wird als einfach angesehen, weil sie weder Layout noch Ereignishandling bereitstellt. Dadurch wird die Leistung gesteigert. Aus diesem Grund sind Zeichnungen ideal für Hintergründe und ClipArt.For this reason, drawings are ideal for backgrounds and clipart. Weitere Informationen finden Sie unter Verwenden von DrawingVisual-Objekten.
Bilder
Die WPF-Imageerstellung bietet eine erhebliche Verbesserung der Imageerstellungsfunktionen in früheren Versionen von Windows. Die Bildverarbeitungsfunktionen wie das Anzeigen einer Bitmap oder das Verwenden eines Bilds für ein allgemeines Steuerelement wurden hauptsächlich von Microsoft Windows Graphics Device Interface (GDI) oder der Microsoft Windows GDI+-API übernommen. Diese APIs haben grundlegende Bildverarbeitungsfunktionen bereitgestellt, hatten aber keine Features wie die Unterstützung von Codec-Erweiterbarkeit und hochwertigen Bildern. WPF Imaging-APIs wurden neu gestaltet, um die Mängel von GDI und GDI+ zu überwinden und einen neuen Satz von APIs bereitzustellen, um Bilder in Ihren Anwendungen anzuzeigen und zu verwenden.
Berücksichtigen Sie bei der Verwendung von Bildern die folgenden Empfehlungen, um eine bessere Leistung zu erzielen:
Wenn Ihre Anwendung die Anzeige von Miniaturansichten erfordert, sollten Sie eine verkleinerte Version des Bilds erstellen. WPF lädt Ihr Bild und decodiert es standardmäßig in seiner vollständigen Größe. Wenn Sie nur eine Miniaturansicht des Bilds möchten, decodiert WPF das Bild übernötigerweise in seine vollständige Größe und skaliert es dann auf die Größe der Miniaturansicht. Um diesen unnötigen Mehraufwand zu vermeiden, können Sie WPF entweder anweisen, das Bild in Miniaturansichtgröße zu decodieren oder ein Bild in Miniaturansichtgröße zu laden.
Decodieren Sie das Bild immer auf die gewünschte Größe und nicht auf die Standardgröße. Wie oben erwähnt, fordern Sie WPF an, ihr Bild auf eine gewünschte Größe zu decodieren und nicht auf die Standard-Vollgröße. Sie reduzieren nicht nur den Arbeitssatz Ihrer Anwendung, sondern auch die Ausführungsgeschwindigkeit.
Kombinieren Sie die Bilder nach Möglichkeit in ein einzelnes Bild, z. B. einen Filmstreifen, der aus mehreren Bildern besteht.
Weitere Informationen finden Sie unter Übersicht über die Bildverarbeitung.
BitmapScalingMode
Beim Animieren der Skalierung von Bitmaps kann der Standardalgorithmus für das Resampling von Bildern hoher Qualität zuweilen so viele Systemressourcen beanspruchen, dass eine Verringerung der Bildfrequenz auftritt und Animationen ruckartig wiedergegeben werden. Indem Sie die BitmapScalingMode-Eigenschaft des RenderOptions Objekts auf LowQualityfestlegen, können Sie beim Skalieren einer Bitmap eine glattere Animation erstellen. Der LowQuality-Modus weist die Rendering-Engine von WPF an, beim Verarbeiten von Bildern von einem qualitätsoptimierten Algorithmus auf einen geschwindigkeitsoptimierten Algorithmus umzuschalten.
Das folgende Beispiel zeigt, wie der Parameter BitmapScalingMode für ein Bildobjekt festgelegt wird.
// Set the bitmap scaling mode for the image to render faster.
RenderOptions.SetBitmapScalingMode(MyImage, BitmapScalingMode.LowQuality);
' Set the bitmap scaling mode for the image to render faster.
RenderOptions.SetBitmapScalingMode(MyImage, BitmapScalingMode.LowQuality)
CachingHint
Standardmäßig speichert WPF nicht den gerenderten Inhalt von TileBrush Objekten, z. B. DrawingBrush und VisualBrush. In statischen Szenarien, in denen sich die Inhalte oder die Nutzung der TileBrush in der Szene nicht ändern, ist dies sinnvoll, da es den Videospeicher spart. Es ergibt weniger Sinn, wenn ein TileBrush-Objekt mit statischem Inhalt auf nicht statische Weise verwendet wird – beispielsweise, wenn ein statisches DrawingBrush- oder VisualBrush-Element auf der Oberfläche eines rotierenden 3D-Objekts abgebildet wird. Das Standardverhalten von WPF besteht darin, den gesamten Inhalt der DrawingBrush oder VisualBrush für jeden Frame neu zu rendern, obwohl sich der Inhalt nicht ändert.
Wenn Sie die CachingHint-Eigenschaft des RenderOptions-Objekts auf Cache festlegen, können Sie die Leistung steigern, indem Sie zwischengespeicherte Versionen der Kacheleffektobjekte verwenden.
Die CacheInvalidationThresholdMinimum- und CacheInvalidationThresholdMaximum Eigenschaftswerte sind relative Größenwerte, die bestimmen, wann das TileBrush-Objekt aufgrund von Skalierungsänderungen neu generiert werden soll. Wenn Sie beispielsweise die eigenschaft CacheInvalidationThresholdMaximum auf 2.0 festlegen, muss der Cache für die TileBrush nur erneut generiert werden, wenn die Größe doppelt so groß wie der aktuelle Cache ist.
Im folgenden Beispiel wird die Verwendung der Option für Zwischenspeicherhinweise für ein DrawingBrush-Element gezeigt.
DrawingBrush drawingBrush = new DrawingBrush();
// Set the caching hint option for the brush.
RenderOptions.SetCachingHint(drawingBrush, CachingHint.Cache);
// Set the minimum and maximum relative sizes for regenerating the tiled brush.
// The tiled brush will be regenerated and re-cached when its size is
// 0.5x or 2x of the current cached size.
RenderOptions.SetCacheInvalidationThresholdMinimum(drawingBrush, 0.5);
RenderOptions.SetCacheInvalidationThresholdMaximum(drawingBrush, 2.0);
Dim drawingBrush As New DrawingBrush()
' Set the caching hint option for the brush.
RenderOptions.SetCachingHint(drawingBrush, CachingHint.Cache)
' Set the minimum and maximum relative sizes for regenerating the tiled brush.
' The tiled brush will be regenerated and re-cached when its size is
' 0.5x or 2x of the current cached size.
RenderOptions.SetCacheInvalidationThresholdMinimum(drawingBrush, 0.5)
RenderOptions.SetCacheInvalidationThresholdMaximum(drawingBrush, 2.0)
Weitere Informationen
.NET Desktop feedback