Dela via


Optimera prestanda: 2D-grafik och bildbehandling

WPF tillhandahåller ett brett utbud av 2D-grafik- och bildfunktioner som kan optimeras för dina programkrav. Det här avsnittet innehåller information om prestandaoptimering inom dessa områden.

Ritning och former

WPF innehåller både Drawing- och Shape objekt som representerar grafiskt ritningsinnehåll. Men Drawing objekt är enklare konstruktioner än Shape objekt och ger bättre prestandaegenskaper.

Med en Shape kan du rita en grafisk form på skärmen. Eftersom de härleds från klassen FrameworkElement kan Shape objekt användas i paneler och de flesta kontroller.

WPF erbjuder flera lager av åtkomst till grafik- och renderingstjänster. På det översta lagret är Shape objekt enkla att använda och ger många användbara funktioner, till exempel layout och händelsehantering. WPF innehåller ett antal färdiga formobjekt. Alla formobjekt ärver från klassen Shape. Tillgängliga formobjekt är Ellipse, Line, Path, Polygon, Polylineoch Rectangle.

Drawing objekt, å andra sidan, härleds inte från klassen FrameworkElement och ger en lättare implementering för återgivning av former, bilder och text.

Det finns fyra typer av Drawing objekt:

Objektet GeometryDrawing används för att återge geometriinnehåll. Klassen Geometry och de betongklasser som härleds från den, till exempel CombinedGeometry, EllipseGeometryoch PathGeometry, ger ett sätt att återge 2D-grafik och ge stöd för träfftestning och urklipp. Geometriobjekt kan användas för att definiera en kontrolls region, till exempel för att definiera klippområdet som ska tillämpas på en bild. Geometriobjekt kan vara enkla regioner, till exempel rektanglar och cirklar, eller sammansatta regioner som skapats från två eller flera geometriobjekt. Mer komplexa geometriska regioner kan skapas genom att kombinera PathSegment-härledda objekt, till exempel ArcSegment, BezierSegmentoch QuadraticBezierSegment.

På ytan är klassen Geometry och klassen Shape liknande. Båda används i renderingen av 2D-grafik och båda har liknande konkreta klasser som härleds från dem, till exempel EllipseGeometry och Ellipse. Det finns dock viktiga skillnader mellan dessa två uppsättningar klasser. För det första saknar klassen Geometry några av funktionerna i klassen Shape, till exempel möjligheten att rita sig själv. Om du vill rita ett geometriobjekt måste en annan klass som DrawingContext, Ritning eller en sökväg (det är värt att notera att en bana är en form) användas för att utföra ritningsåtgärden. Återgivningsegenskaper som fyllning, linje och linjetjocklek finns i klassen som ritar geometriobjektet, medan ett formobjekt innehåller dessa egenskaper. Ett sätt att tänka på den här skillnaden är att ett geometriobjekt definierar en region, till exempel en cirkel, medan ett formobjekt definierar en region, definierar hur den regionen fylls och beskrivs och deltar i layoutsystemet.

Eftersom Shape objekt härleds från klassen FrameworkElement kan användningen av dem öka minnesförbrukningen avsevärt i ditt program. Om du verkligen inte behöver FrameworkElement funktioner för ditt grafiska innehåll bör du överväga att använda lättare Drawing objekt.

För mer information om Drawing-objekt, se Översikt över ritobjekt .

StreamGeometry-objekt

Objektet StreamGeometry är ett enkelt alternativ till PathGeometry för att skapa geometriska former. Använd en StreamGeometry när du behöver beskriva en komplex geometri. StreamGeometry är optimerad för hantering av många PathGeometry objekt och fungerar bättre jämfört med att använda många enskilda PathGeometry objekt.

I följande exempel används attributsyntax för att skapa en triangulär StreamGeometry i 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>

Mer information om StreamGeometry objekt finns i Skapa en form med hjälp av en StreamGeometry-.

DrawingVisual-objekt

Objektet DrawingVisual är en lätt ritningsklass som används för att återge former, bilder eller text. Den här klassen anses vara lätt eftersom den inte tillhandahåller layout eller händelsehantering, vilket förbättrar dess prestanda. Därför är ritningar idealiska för bakgrunder och ClipArt. Mer information finns i Using DrawingVisual Objects.

Bilder

WPF-avbildning ger en betydande förbättring jämfört med avbildningsfunktionerna i tidigare versioner av Windows. Avbildningsfunktioner, till exempel att visa en bitmapp eller använda en bild på en gemensam kontroll, hanterades främst av Microsoft Windows Graphics Device Interface (GDI) eller Microsoft Windows GDI+ application programming interface (API). Dessa API:er tillhandahöll baslinjeavbildningsfunktioner men saknade funktioner som stöd för codec-utökningsbarhet och bildstöd med hög återgivning. WPF Imaging API:er har gjorts om för att åtgärda bristerna i GDI och GDI+ och tillhandahålla en ny uppsättning API:er för att visa och använda bilder i dina program.

När du använder bilder bör du överväga följande rekommendationer för att få bättre prestanda:

  • Om ditt program kräver att du visar miniatyrbilder bör du överväga att skapa en reducerad version av bilden. Som standard läser WPF in avbildningen och avkodar den till sin fulla storlek. Om du bara vill ha en miniatyrversion av bilden avkodar WPF i onödan bilden till full storlek och skalar sedan ned den till en miniatyrstorlek. För att undvika detta onödiga omkostnader kan du antingen begära att WPF avkodar bilden till en miniatyrstorlek eller begära att WPF läser in en miniatyrbild.

  • Avkoda alltid bilden till önskad storlek och inte till standardstorleken. Som nämnts ovan, begär WPF att avkoda din bild till en önskad storlek och inte standard full storlek. Du minskar inte bara programmets arbetsuppsättning, utan även körningshastigheten.

  • Om möjligt kan du kombinera bilderna till en enda bild, till exempel en filmremsa som består av flera bilder.

  • Mer information finns i Imaging Overview.

BitmapScalingMode

När du animerar skalan för vilken bitmap som helst kan standardalgoritmen för bildomprovtagning av hög kvalitet ibland förbruka tillräckligt med systemresurser för att orsaka försämrad bildfrekvens, vilket effektivt gör att animeringar hackar. Genom att ange egenskapen BitmapScalingMode för det RenderOptions objektet till LowQualitykan du skapa en jämnare animering när du skalar en bitmapp. LowQuality läge instruerar WPF-renderingsmotorn att växla från en kvalitetsoptimerad algoritm till en hastighetsoptimerad algoritm vid bearbetning av bilder.

I följande exempel visas hur du anger BitmapScalingMode för ett bildobjekt.

// 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)

CachelagringHint

Som standard lagrar WPF inte det renderade innehållet i cache för TileBrush-objekt, till exempel DrawingBrush och VisualBrush. I statiska scenarier där innehållet eller användningen av TileBrush i scenen inte ändras, är detta vettigt eftersom det sparar videominne. Det är inte så meningsfullt när en TileBrush med statiskt innehåll används på ett icke-statiskt sätt, till exempel när en statisk DrawingBrush eller VisualBrush mappas till ytan på ett roterande 3D-objekt. Standardbeteendet för WPF är att åter återge hela innehållet i DrawingBrush eller VisualBrush för varje bildruta, även om innehållet är oförändrat.

Genom att ange egenskapen CachingHint för objektet RenderOptions till Cachekan du öka prestandan med hjälp av cachelagrade versioner av de tillagda penselobjekten.

Egenskapsvärdena CacheInvalidationThresholdMinimum och CacheInvalidationThresholdMaximum är relativa storleksvärden som avgör när det TileBrush objektet ska återskapas på grund av ändringar i skalan. Genom att till exempel ange egenskapen CacheInvalidationThresholdMaximum till 2.0 behöver cachen för TileBrush bara återskapas när dess storlek överskrider dubbelt så stor som den aktuella cachen.

I det följande exemplet visas hur du använder cache-hints-alternativet för en DrawingBrush.

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)

Se även