Prestaties optimaliseren: 2D Graphics en Imaging
WPF biedt een breed scala aan 2D-graphics en imaging-functionaliteit die kan worden geoptimaliseerd voor uw toepassingsvereisten. Dit onderwerp bevat informatie over prestatieoptimalisatie op deze gebieden.
Tekenen en vormen
WPF biedt zowel Drawing- als Shape objecten voor grafische tekeninhoud. Drawing objecten zijn echter eenvoudigere constructies dan Shape objecten en bieden betere prestatiekenmerken.
Met een Shape kunt u een grafische vorm tekenen op het scherm. Omdat ze zijn afgeleid van de FrameworkElement klasse, kunnen Shape objecten worden gebruikt binnen panelen en de meeste besturingselementen.
WPF biedt verschillende lagen toegang tot grafische en renderingservices. Op de bovenste laag zijn Shape objecten eenvoudig te gebruiken en bieden veel nuttige functies, zoals indeling en gebeurtenisafhandeling. WPF biedt een aantal kant-en-klare shapeobjecten. Alle vormobjecten erven van de klasse Shape. Beschikbare shapeobjecten zijn onder andere Ellipse, Line, Path, Polygon, Polylineen Rectangle.
Drawing-objecten daarentegen zijn die niet afleiden van de FrameworkElement-klasse en een lichtere implementatie bieden voor het weergeven van vormen, afbeeldingen en tekst.
Er zijn vier typen Drawing objecten:
GeometryDrawing Hiermee tekent u een vorm.
ImageDrawing tekent een afbeelding.
GlyphRunDrawing tekent tekst.
DrawingGroup Maakt andere tekeningen. Gebruik een tekengroep om andere tekeningen te combineren tot één samengestelde tekening.
Het GeometryDrawing-object wordt gebruikt om geometrie-inhoud weer te geven. De Geometry-klasse en de concrete klassen die ermee zijn afgeleid, zoals CombinedGeometry, EllipseGeometryen PathGeometry, bieden een middel voor het weergeven van 2D-afbeeldingen en het bieden van hit-testing en knipondersteuning. Geometrieobjecten kunnen bijvoorbeeld worden gebruikt om het gebied van een besturingselement te definiëren of om het clipgebied te definiëren dat moet worden toegepast op een afbeelding. Geometrieobjecten kunnen eenvoudige regio's zijn, zoals rechthoeken en cirkels, of samengestelde gebieden die zijn gemaakt op basis van twee of meer geometrieobjecten. Complexere geometrische gebieden kunnen worden gemaakt door PathSegment-afgeleide objecten te combineren, zoals ArcSegment, BezierSegmenten QuadraticBezierSegment.
Op het oppervlak zijn de Geometry-klasse en de Shape klasse vergelijkbaar. Beide worden gebruikt in het weergeven van 2D-afbeeldingen en beide hebben vergelijkbare betonklassen die hiervan zijn afgeleid, bijvoorbeeld EllipseGeometry en Ellipse. Er zijn echter belangrijke verschillen tussen deze twee sets klassen. Ten eerste mist de Geometry-klasse enkele functionaliteiten van de Shape-klasse, zoals de mogelijkheid om zichzelf weer te geven. Als u een geometrieobject wilt tekenen, moet een andere klasse, zoals DrawingContext, Drawing of Path (het is de moeite waard om te noteren dat een pad een shape is), worden gebruikt om de tekenbewerking uit te voeren. Renderingeigenschappen zoals opvulling, lijn en dikte van de lijn bevinden zich in de klasse die het geometrieobject tekent, terwijl een shapeobject deze eigenschappen bevat. Een manier om dit verschil te bedenken, is dat een geometrieobject een regio definieert, bijvoorbeeld een cirkel, terwijl een shapeobject een regio definieert, definieert hoe dat gebied wordt gevuld en beschreven, en deelneemt aan het indelingssysteem.
Omdat Shape objecten zijn afgeleid van de FrameworkElement-klasse, kunnen ze aanzienlijk meer geheugenverbruik in uw toepassing toevoegen. Als u de FrameworkElement functies voor uw grafische inhoud echt niet nodig hebt, kunt u overwegen de lichtere Drawing objecten te gebruiken.
Zie Overzicht van tekenobjectenvoor meer informatie over Drawing objecten.
StreamGeometry-objecten
Het StreamGeometry object is een lichtgewicht alternatief voor PathGeometry voor het maken van geometrische vormen. Gebruik een StreamGeometry wanneer u een complexe geometrie moet beschrijven. StreamGeometry is geoptimaliseerd voor het verwerken van veel PathGeometry objecten en presteert beter in vergelijking met het gebruik van veel afzonderlijke PathGeometry objecten.
In het volgende voorbeeld wordt de syntaxis van kenmerken gebruikt om een driehoekige StreamGeometry te maken in XAML.
<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>
Voor meer informatie over StreamGeometry objecten, zie Een shape maken met een StreamGeometry-.
Objecten van DrawingVisual
Het DrawingVisual-object is een lichtgewicht tekenklasse die wordt gebruikt om vormen, afbeeldingen of tekst weer te geven. Deze klasse wordt als lichtgewicht beschouwd omdat deze geen indeling of gebeurtenisafhandeling biedt, waardoor de prestaties worden verbeterd. Daarom zijn tekeningen ideaal voor achtergronden en illustraties. Zie Gebruik van DrawingVisual-objectenvoor meer informatie.
Beelden
WPF imaging biedt een aanzienlijke verbetering ten opzichte van de mogelijkheden voor imaging in eerdere versies van Windows. Imaging-mogelijkheden, zoals het weergeven van een bitmap of het gebruik van een afbeelding op een gemeenschappelijk besturingselement, werden voornamelijk verwerkt door de Microsoft Windows Graphics Device Interface (GDI) of Microsoft Windows GDI+ application programming interface (API). Deze API's bieden basislijnfunctionaliteit voor imaging, maar ontbreken functies zoals ondersteuning voor codec-uitbreidbaarheid en ondersteuning voor afbeeldingen met hoge kwaliteit. WPF Imaging-API's zijn opnieuw ontworpen om de tekortkomingen van GDI en GDI+ te overwinnen en een nieuwe set API's te bieden om afbeeldingen in uw toepassingen weer te geven en te gebruiken.
Houd bij het gebruik van afbeeldingen rekening met de volgende aanbevelingen voor betere prestaties:
Als uw toepassing vereist dat u miniatuurafbeeldingen weergeeft, kunt u overwegen een versie van de afbeelding met een kleiner formaat te maken. WPF laadt uw afbeelding standaard en decodeert deze naar volledige grootte. Als u alleen een miniatuurversie van de afbeelding wilt, wordt de afbeelding door WPF onnodig gedecodeert naar de volledige grootte en vervolgens omlaag geschaald naar een miniatuurgrootte. Om deze onnodige overhead te voorkomen, kunt u WPF aanvragen om de afbeelding te decoderen naar een miniatuurgrootte of WPF vragen om een afbeelding van de miniatuurgrootte te laden.
De afbeelding altijd decoderen naar de gewenste grootte en niet naar de standaardgrootte. Zoals hierboven vermeld, vraagt u WPF om uw afbeelding te decoderen naar een gewenste grootte en niet de standaard volledige grootte. U vermindert niet alleen de werkset van uw toepassing, maar ook de uitvoeringssnelheid.
Combineer indien mogelijk de afbeeldingen in één afbeelding, zoals een filmstrook die uit meerdere afbeeldingen bestaat.
Zie Imaging Overviewvoor meer informatie.
BitmapScalingMode
Wanneer u de schaal van een bitmap wijzigt, kan het standaard algoritme voor het opnieuwamplen van afbeeldingen van hoge kwaliteit soms voldoende systeemresources verbruiken om een framesnelheidvermindering te veroorzaken, waardoor animaties stutters veroorzaken. Door de eigenschap BitmapScalingMode van het RenderOptions-object in te stellen op LowQuality, kunt u een vloeiendere animatie maken bij het schalen van een bitmap. LowQuality-modus vertelt de WPF-renderingengine om over te schakelen van een algoritme dat is geoptimaliseerd voor kwaliteit tot een algoritme dat is geoptimaliseerd voor snelheid bij het verwerken van afbeeldingen.
In het volgende voorbeeld ziet u hoe u de BitmapScalingMode instelt voor een afbeeldingsobject.
// 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
WPF slaat standaard de weergegeven inhoud van TileBrush objecten, zoals DrawingBrush en VisualBrush, niet in de cache op. In statische scenario's waarin de inhoud of het gebruik van de TileBrush in de scène niet verandert, is dit logisch, omdat het videogeheugen bespaart. Het is niet zo logisch als een TileBrush met statische inhoud op een niet-statische manier wordt gebruikt, bijvoorbeeld wanneer een statische DrawingBrush of VisualBrush is toegewezen aan het oppervlak van een draaiend 3D-object. Het standaardgedrag van WPF is het opnieuw weergeven van de volledige inhoud van de DrawingBrush of VisualBrush voor elk frame, zelfs als de inhoud niet verandert.
Door de eigenschap CachingHint van het RenderOptions-object in te stellen op Cache, kunt u de prestaties verbeteren met behulp van gecachede versies van de penselobjecten.
De eigenschapswaarden CacheInvalidationThresholdMinimum en CacheInvalidationThresholdMaximum zijn relatieve groottewaarden die bepalen wanneer het TileBrush object opnieuw moet worden gegenereerd vanwege wijzigingen in de schaal. Als u bijvoorbeeld de eigenschap CacheInvalidationThresholdMaximum instelt op 2.0, hoeft de cache voor de TileBrush alleen opnieuw te worden gegenereerd wanneer de grootte groter is dan twee keer de grootte van de huidige cache.
In het volgende voorbeeld ziet u hoe u de optie voor het opslaan van cachehints voor een DrawingBrushgebruikt.
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)
Zie ook
.NET Desktop feedback