Optimieren der Leistung: 2D-Grafiken und Bildverarbeitung
Aktualisiert: November 2007
WPF stellt zahlreiche Funktionen für 2D-Grafiken und Bildverarbeitung zur Verfügung, die den Anforderungen Ihrer Anwendung entsprechend optimiert werden können. Dieses Thema enthält Informationen über die Leistungsoptimierung in diesen Bereichen.
Dieses Thema enthält folgende Abschnitte.
- Zeichnen und Formen
- StreamGeometry-Objekte
- DrawingVisual-Objekte
- Bilder
- Verwandte Abschnitte
Zeichnen und Formen
WPF stellt sowohl Drawing-Objekte als auch Shape-Objekte bereit, um grafischen Zeichnungsinhalt darzustellen. Drawing-Objekte sind jedoch einfachere Konstrukte als Shape-Objekte und stellen bessere Leistungsmerkmale bereit.
Mit Shape können Sie eine grafische Form auf dem Bildschirm zeichnen. Da sie von der FrameworkElement-Klasse abgleitet werden, können Shape-Objekte in Bereichen und den meisten Steuerelementen verwendet werden.
WPF bietet mehrere Ebenen für den Zugriff auf Grafiken und Renderingdienste. Auf der obersten Ebene stehen die benutzerfreundlichen Shape-Objekte mit einer Vielzahl von nützlichen Features zur Verfügung, z. B. Layout und Behandlung von Ereignissen. WPF bietet eine Reihe einsatzbereiter Shape-Objekte. Alle Shape-Objekte erben von der Shape-Klasse. Zu den verfügbaren Shape-Objekten gehören Ellipse, Line, Path, Polygon, Polyline und Rectangle.
Drawing-Objekte werden dagegen nicht von der FrameworkElement-Klasse abgeleitet und bieten eine einfache Implementierung für das Rendering von Formen, Bildern und Text.
Es gibt vier Typen von Drawing-Objekten:
GeometryDrawing - Zeichnet eine Form.
ImageDrawing - Zeichnet ein Bild.
GlyphRunDrawing - Zeichnet Text.
DrawingGroup - Zeichnet andere Zeichnungen. Verwenden Sie eine Zeichnungsgruppe, um aus anderen Zeichnungen eine einzelne zusammengesetzte Zeichnung zu bilden.
Das GeometryDrawing-Objekt wird verwendet, um Geometrieinhalt zu rendern. Die Geometry-Klasse und die von ihr abgeleiteten konkreten Klassen, wie CombinedGeometry, EllipseGeometry und PathGeometry, bieten eine Möglichkeit für das Rendering von 2D-Grafiken und stellen außerdem Unterstützung für Trefferüberprüfungen und Clipping bereit. Mit Geometry-Objekten können beispielsweise der Bereich eines Steuerelements oder der auf ein Bild anzuwendende Clip-Bereich definiert werden. Bei Geometry-Objekten kann es sich um einfache Bereiche wie Rechtecke und Kreise oder um aus einem oder mehreren geometrischen Objekten zusammengesetzte Regionen handeln. Komplexere geometrische Regionen können erstellt werden, indem von PathSegment abgeleitete Objekte wie ArcSegment, BezierSegment und QuadraticBezierSegment kombiniert werden.
Auf den ersten Blick sind die Geometry-Klasse und die Shape-Klasse recht ähnlich. Beide werden für das Rendering von 2D-Grafiken verwendet und verfügen über ähnliche konkrete Klassen, die von ihnen abgeleitet werden, z. B. EllipseGeometry und Ellipse. Es gibt jedoch wichtige Unterschiede zwischen diesen zwei Sätzen von Klassen. Bei der Geometry-Klasse werden einige Funktionen der Shape-Klasse nicht unterstützt, wie die Fähigkeit, sich selbst zu zeichnen. Zum Zeichnen eines Geometry-Objekts muss eine andere Klasse, beispielsweise DrawingContext, Drawing oder Path (dabei ist zu beachten, dass ein Path eine Shape ist), verwendet werden, um den Zeichnungsvorgang auszuführen. Renderingeigenschaften wie Füllung, Strich und Strichstärke befinden sich in der Klasse, die das Geometry-Objekt zeichnet, während ein Shape-Objekt diese Eigenschaften enthält. Eine Möglichkeit zur Annäherung an diesen Unterschied besteht darin, dass ein Geometry-Objekt einen Bereich definiert, z. B. einen Kreis, während ein Shape-Objekt definiert, wie dieser Bereich gefüllt und konturiert wird und eine Komponente des Layoutsystems ist.
Da Shape-Objekte von der FrameworkElement-Klasse abgeleitet werden, kann durch ihre Verwendung deutlich mehr Speicher in der Anwendung belegt werden. Wenn Sie für den grafischen Inhalt auf die FrameworkElement-Features verzichten können, sollten Sie die Verwendung der einfachen Drawing-Objekte in Betracht ziehen.
Weitere Informationen über Drawing-Objekte finden Sie unter Übersicht über Zeichnungsobjekte.
StreamGeometry-Objekte
Das StreamGeometry-Objekt stellt eine einfache Alternative zu PathGeometry für das Erstellen geometrischer Formen dar. Verwenden Sie eine StreamGeometry, wenn Sie eine komplexe Geometrie beschreiben müssen. StreamGeometry ist für die Behandlung vieler PathGeometry-Objekte optimiert und zeigt eine bessere Leistung als die Verwendung mehrerer einzelner PathGeometry-Objekte.
Im folgenden Beispiel wird mithilfe der Attributsyntax eine dreieckige StreamGeometry in XAML erstellt.
<Page xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel>
<Path Data="F0 M10,100 L100,100 100,50Z"
StrokeThickness="1" Stroke="Black"/>
</StackPanel>
</Page>
Weitere Informationen über StreamGeometry-Objekte finden Sie unter Gewusst wie: Erstellen einer Form mithilfe von 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 Ereignisbehandlung bereitstellt. Dadurch wird die Leistung gesteigert. Aus diesem Grund sind Zeichnungen ideal für Hintergründe und ClipArt. Weitere Informationen finden Sie unter Verwenden von DrawingVisual-Objekten.
Bilder
WPF-Bildverarbeitung stellt gegenüber den Bildverarbeitungsfähigkeiten in vorherigen Versionen von Windows eine deutliche Verbesserung dar. Die Bildverarbeitungsfähigkeiten 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 behandelt. Diese API hat Baseline-Bildverarbeitungsfunktionen bereitgestellt, verfügte jedoch nicht über Features wie die Unterstützung von Codec-Erweiterbarkeit und hochwertigen Bildern. Die WPF-Bildverarbeitungs-APIs wurden neu entworfen, um die Nachteile von GDI und GDI+ zu beheben und einen neuen Satz von APIs bereitzustellen, um Bilder in den Anwendungen anzuzeigen und zu verwenden.
Beim Verwenden von Bildern sollten Sie die folgenden Empfehlungen in Betracht ziehen, um eine bessere Leistung zu erzielen:
Wenn die Anwendung die Anzeige von Miniaturbildern erfordert, erstellen Sie eine Bildversion in reduzierter Größe. Standardmäßig lädt WPF das Bild und decodiert es in seine vollständige Größe. Wenn Sie nur eine Miniaturansicht des Bilds möchten, decodiert WPF das Bild überflüssigerweise in seine vollständige Größe und skaliert es dann auf die Größe der Miniaturansicht. Um diesen unnötigen Aufwand zu vermeiden, können Sie entweder bei WPF eine Decodierung des Bilds in Miniaturansichtgröße oder das Laden eines Bilds in Miniaturansichtgröße anfordern.
Decodieren Sie das Bild immer in die gewünschte Größe und nicht in die Standardgröße. Wie bereits erwähnt, fordern Sie bei WPF eine Decodierung des Bilds in die gewünschte Größe und nicht in die vollständige Größe an. Auf diese Weise reduzieren Sie nicht nur das Workingset der Anwendung, Sie erhöhen auch die Ausführungsgeschwindigkeit.
Kombinieren Sie die Bilder nach Möglichkeit in einem Einzelbild, wie ein Filmstreifen, der sich aus mehreren Bildern zusammensetzt.
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 einen solchen Umfang an Systemressourcen beanspruchen, dass eine Verringerung der Einzelbildrate auftritt und Animationen ruckartig wiedergegeben werden. Durch Festlegen der BitmapScalingMode-Eigenschaft des RenderOptions Objekts auf LowQuality können Sie eine glattere Animation beim Skalieren einer Bitmap erreichen. Der LowQuality-Modus weist das WPF-Renderingmodul an, beim Verarbeiten von Bildern von einem qualitätsoptimierten Algorithmus auf einen geschwindigkeitsoptimierten Algorithmus umzuschalten.
Im folgenden Beispiel wird gezeigt, wie der BitmapScalingMode für ein Bildobjekt festgelegt wird.
// Set the bitmap scaling mode for the image to render faster.
RenderOptions.SetBitmapScalingMode(MyImage, BitmapScalingMode.LowQuality);
CachingHint
In WPF wird der gerenderte Inhalt von TileBrush-Objekten, z. B. DrawingBrush und VisualBrush, standardmäßig nicht zwischengespeichert. In statischen Szenarios, in denen sich weder der Inhalt noch die Verwendung des TileBrush in der Szene ändern, ist dies sinnvoll, da Videospeicher gespart wird. Das Verfahren ist hingegen nicht sinnvoll, wenn ein TileBrush mit statischem Inhalt auf nicht statische Weise verwendet wird, z. B. wenn ein statischer DrawingBrush oder VisualBrush der Oberfläche eines sich drehenden 3D-Objekts zugeordnet wird. Das Standardverhalten von WPF besteht im erneuten Rendern des gesamten DrawingBrush-Inhalts oder VisualBrush-Inhalts für jeden Frame, selbst wenn der Inhalt unverändert bleibt.
Sie können die Leistung erhöhen, indem Sie die CachingHint-Eigenschaft des RenderOptions-Objekts auf Cache festlegen und die zwischengespeicherten Versionen der gekachelten Pinselobjekte verwenden.
Der CacheInvalidationThresholdMinimum-Eigenschaftenwert und der CacheInvalidationThresholdMaximum-Eigenschaftenwert sind Werte von relativer Größe, die bestimmen, wann das TileBrush-Objekt aufgrund einer geänderten Skalierung neu generiert werden sollte. Wenn beispielsweise die CacheInvalidationThresholdMaximum-Eigenschaft auf 2,0 festgelegt ist, muss der Cache für den TileBrush nur neu generiert werden, wenn seine Größe die Größe des aktuellen Caches um mehr als das Doppelte überschreitet.
Im folgenden Beispiel wird gezeigt, wie die Zwischenspeicherungshinweisoption für einen DrawingBrush verwendet wird.
// Set the minimum and maximum relative sizes for regenerating the tiled brush.
RenderOptions.SetCacheInvalidationThresholdMinimum(drawingBrush, 0.5);
RenderOptions.SetCacheInvalidationThresholdMaximum(drawingBrush, 2.0);
// The tiled brush will be regenerated when the size is
// 0.5x, 0.25x (and so forth)
// and
// 2x, 4x, 8x (and so forth)
// of the original size.
// Set the caching hint option for the brush.
RenderOptions.SetCachingHint(drawingBrush, CachingHint.Cache);
Siehe auch
Konzepte
Optimieren der WPF-Anwendungsleistung
Optimieren der Leistung: Vorteile der Hardware nutzen
Optimieren der Leistung: Layout und Entwurf
Optimieren der Leistung: Objektverhalten
Optimieren der Leistung: Anwendungsressourcen
Optimieren der Leistung: Datenbindung
Optimieren der Leistung: Weitere Empfehlungen