Ottimizzazione delle prestazioni: Grafica 2D e creazione di immaginiOptimizing Performance: 2D Graphics and Imaging

WPFWPF offre un'ampia gamma di funzionalità di grafica 2D e creazione di immagini che possono essere ottimizzate in base ai requisiti dell'applicazione.provides a wide range of 2D graphics and imaging functionality that can be optimized for your application requirements. Questo argomento fornisce informazioni sull'ottimizzazione delle prestazioni in queste aree.This topic provides information about performance optimization in those areas.

Disegno e formeDrawing and Shapes

WPFWPFfornisce oggetti Shape e per rappresentare il contenuto del disegno grafico. Drawingprovides both Drawing and Shape objects to represent graphical drawing content. Tuttavia, Drawing gli oggetti sono costrutti più semplici Shape rispetto agli oggetti e offrono caratteristiche di prestazioni migliori.However, Drawing objects are simpler constructs than Shape objects and provide better performance characteristics.

Un Shape oggetto consente di disegnare una forma grafica sullo schermo.A Shape allows you to draw a graphical shape to the screen. Poiché derivano dalla FrameworkElement classe, Shape gli oggetti possono essere utilizzati all'interno di pannelli e la maggior parte dei controlli.Because they are derived from the FrameworkElement class, Shape objects can be used inside panels and most controls.

WPFWPF offre diversi livelli di accesso alla grafica e ai servizi di rendering.offers several layers of access to graphics and rendering services. Al livello superiore, Shape gli oggetti sono facili da usare e offrono numerose funzionalità utili, ad esempio il layout e la gestione degli eventi.At the top layer, Shape objects are easy to use and provide many useful features, such as layout and event handling. WPFWPF offre anche una serie di oggetti Shape pronti all'uso.provides a number of ready-to-use shape objects. Tutti gli oggetti Shape ereditano Shape dalla classe.All shape objects inherit from the Shape class. Gli oggetti Shape disponibili Ellipseincludono Line Path,, Polygon, Polyline, e Rectangle.Available shape objects include Ellipse, Line, Path, Polygon, Polyline, and Rectangle.

Drawinggli oggetti, d'altra parte, non derivano dalla FrameworkElement classe e forniscono un'implementazione più leggera per il rendering di forme, immagini e testo.Drawing objects, on the other hand, do not derive from the FrameworkElement class and provide a lighter-weight implementation for rendering shapes, images, and text.

Sono disponibili quattro tipi di Drawing oggetti:There are four types of Drawing objects:

L' GeometryDrawing oggetto viene utilizzato per eseguire il rendering del contenuto della geometria.The GeometryDrawing object is used to render geometry content. La Geometry classe e le classi concrete che derivano da esso, CombinedGeometryad EllipseGeometryesempio, PathGeometrye, forniscono un mezzo per il rendering di immagini 2D, oltre a fornire il supporto per l'hit testing e il ritaglio.The Geometry class and the concrete classes which derive from it, such as CombinedGeometry, EllipseGeometry, and PathGeometry, provide a means for rendering 2D graphics, as well as providing hit-testing and clipping support. Gli oggetti Geometry possono essere usati per definire, ad esempio, l'area di un controllo o l'area di ritaglio da applicare a un'immagineGeometry objects can be used to define the region of a control, for example, or to define the clip region to apply to an image. e possono essere semplici aree, quali rettangoli o cerchi, oppure aree composite create con due o più oggetti Geometry.Geometry objects can be simple regions, such as rectangles and circles, or composite regions created from two or more geometry objects. È possibile creare aree geometriche più PathSegmentcomplesse combinando oggetti derivati da, BezierSegment ArcSegmentad esempio QuadraticBezierSegment, e.More complex geometric regions can be created by combining PathSegment-derived objects, such as ArcSegment, BezierSegment, and QuadraticBezierSegment.

Sulla superficie, la Geometry classe e la Shape classe sono molto simili.On the surface, the Geometry class and the Shape class are quite similar. Entrambi vengono usati nel rendering di grafica 2D ed entrambi hanno classi concrete simili che derivano da esse, ad esempio EllipseGeometry e Ellipse.Both are used in the rendering of 2D graphics and both have similar concrete classes which derive from them, for example, EllipseGeometry and Ellipse. Esistono tuttavia importanti differenze tra questi due set di classi.However, there are important differences between these two sets of classes. Per uno, la Geometry classe non dispone di alcune funzionalità Shape della classe, ad esempio la possibilità di disegnarla.For one, the Geometry class lacks some of the functionality of the Shape class, such as the ability to draw itself. Per disegnare un oggetto Geometry, è necessario usare un'altra classe, ad esempio DrawingContext, Drawing o Path (notare che Path è un oggetto Shape) per poter eseguire l'operazione di disegno.To draw a geometry object, another class such as DrawingContext, Drawing, or a Path (it is worth noting that a Path is a Shape) must be used to perform the drawing operation. Le proprietà di rendering, tra cui il riempimento, il tratto e lo spessore del tratto, si trovano nella classe che consente di disegnare l'oggetto Geometry, ma sono contenute direttamente in un oggetto Shape.Rendering properties such as fill, stroke, and the stroke thickness are on the class which draws the geometry object, while a shape object contains these properties. In altre parole, un oggetto Geometry definisce un'area, ad esempio un cerchio, mentre un oggetto Shape definisce un'area, il modo in cui questa viene riempita e delineata e partecipa al sistema di layout.One way to think of this difference is that a geometry object defines a region, a circle for example, while a shape object defines a region, defines how that region is filled and outlined, and participates in the layout system.

Poiché Shape gli oggetti derivano FrameworkElement dalla classe, l'uso di tali oggetti può aumentare significativamente il consumo di memoria nell'applicazione.Since Shape objects derive from the FrameworkElement class, using them can add significantly more memory consumption in your application. Se non sono necessarie le FrameworkElement funzionalità per il contenuto grafico, provare a usare gli Drawing oggetti più semplici.If you really do not need the FrameworkElement features for your graphical content, consider using the lighter-weight Drawing objects.

Per altre informazioni sugli Drawing oggetti, vedere Cenni preliminari sugli oggetti Drawing.For more information on Drawing objects, see Drawing Objects Overview.

Oggetto StreamGeometryStreamGeometry Objects

L' StreamGeometry oggetto è un'alternativa semplice a PathGeometry per la creazione di forme geometriche.The StreamGeometry object is a lightweight alternative to PathGeometry for creating geometric shapes. Usare un StreamGeometry oggetto quando è necessario descrivere una geometria complessa.Use a StreamGeometry when you need to describe a complex geometry. StreamGeometryè ottimizzato per la PathGeometry gestione di molti oggetti e offre prestazioni migliori rispetto all' PathGeometry utilizzo di molti singoli oggetti.StreamGeometry is optimized for handling many PathGeometry objects and performs better when compared to using many individual PathGeometry objects.

Nell'esempio seguente viene usata la sintassi degli attributi per creare StreamGeometry un XAMLXAMLtriangolare in.The following example uses attribute syntax to create a triangular StreamGeometry in XAMLXAML.

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

Per altre informazioni sugli StreamGeometry oggetti, vedere creare una forma usando un StreamGeometry.For more information on StreamGeometry objects, see Create a Shape Using a StreamGeometry.

Oggetti DrawingVisualDrawingVisual Objects

L' DrawingVisual oggetto è una classe di disegno semplificata utilizzata per il rendering di forme, immagini o testo.The DrawingVisual object is a lightweight drawing class that is used to render shapes, images, or text. Questa classe è considerata semplice perché non offre la gestione di layout o eventi, con un conseguente aumento delle prestazioni.This class is considered lightweight because it does not provide layout or event handling, which improves its performance. Per questo motivo, i disegni sono ideali per sfondi e ClipArt.For this reason, drawings are ideal for backgrounds and clip art. Per altre informazioni, vedere Uso degli oggetti DrawingVisual.For more information, see Using DrawingVisual Objects.

ImmaginiImages

WPFWPFla creazione di immagini offre un miglioramento significativo rispetto alle funzionalità di creazione di immagini nelle versioni precedenti di Windows.imaging provides a significant improvement over the imaging capabilities in previous versions of Windows. Le funzionalità per la creazione di immagini, come la visualizzazione di una bitmap o l'uso di un'immagine per un controllo comune, venivano gestite inizialmente dalle API (Application Programming Interface) Graphics Device Interface (GDI) o GDI+ di Microsoft Windows.Imaging capabilities, such as displaying a bitmap or using an image on a common control were primarily handled by the Microsoft Windows Graphics Device Interface (GDI) or Microsoft Windows GDI+ application programming interface (API). Queste API offrivano funzionalità di base per la creazione di immagini, ma erano sprovviste di funzionalità come il supporto per l'estendibilità dei codec o per immagini ad alta fedeltà.These API provided baseline imaging functionality, but lacked features such as support for codec extensibility and high fidelity image support. Le API per la creazione di immagini di WPF sono state riprogettate per colmare le carenze di GDI e GDI+ e offrire un nuovo set di API per visualizzare e usare le immagini all'interno delle applicazioni.WPF Imaging API have been redesigned to overcome the shortcomings of GDI and GDI+ and provide a new set of API to display and use images within your applications.

Per ottenere prestazioni migliori durante l'uso di immagini, seguire questi consigli:When using images, consider the following recommendations for gaining better performance:

  • Se l'applicazione richiede la visualizzazione di immagini di anteprima, creare una versione ridotta dell'immagine.If your application requires you to display thumbnail images, consider creating a reduced-sized version of the image. Per impostazione predefinita, WPFWPF carica l'immagine e la decodifica con le dimensioni originali.By default, WPFWPF loads your image and decodes it to its full size. Se si vuole soltanto un'immagine di anteprima, WPFWPF decodifica comunque l'immagine con le dimensioni originali e successivamente la riduce alle dimensioni di un'anteprima.If you only want a thumbnail version of the image, WPFWPF unnecessary decodes the image to its full-size and then scales it down to a thumbnail size. Per evitare questo inutile sovraccarico, è possibile richiedere a WPFWPF di decodificare l'immagine con le dimensioni dell'anteprima oppure richiedere a WPFWPF di caricare direttamente l'immagine di anteprima.To avoid this unnecessary overhead, you can either request WPFWPF to decode the image to a thumbnail size, or request WPFWPF to load a thumbnail size image.

  • Decodificare sempre l'immagine con le dimensioni desiderate e non con quelle predefinite.Always decode the image to desired size and not to the default size. Richiedere quindi a WPFWPF di eseguire la codifica secondo le dimensioni desiderate e non in base a quelle predefinite.As mentioned above, request WPFWPF to decode your image to a desired size and not the default full size. In questo modo è possibile ridurre non solo il working set dell'applicazione ma anche la velocità di esecuzione.You will reduce not only your application's working set, but execution speed as well.

  • Se possibile, combinare le immagini in un'unica immagine, come una pellicola cinematografica composta da più immagini.If possible, combine the images into a single image, such as a film strip composed of multiple images.

  • Per altre informazioni, vedere Panoramica della creazione dell'immagine.For more information, see Imaging Overview.

BitmapScalingModeBitmapScalingMode

Quando si aggiunge un'animazione alla scala di una bitmap, è possibile che l'algoritmo di ricampionamento delle immagini di alta qualità determini un consumo di risorse di sistema tale da rallentare la frequenza dei fotogrammi, provocando lo stuttering delle animazioni.When animating the scale of any bitmap, the default high-quality image re-sampling algorithm can sometimes consume sufficient system resources to cause frame rate degradation, effectively causing animations to stutter. Impostando la BitmapScalingMode proprietà RenderOptions dell'oggetto su LowQuality è possibile creare un'animazione più uniforme durante il ridimensionamento di una bitmap.By setting the BitmapScalingMode property of the RenderOptions object to LowQuality you can create a smoother animation when scaling a bitmap. LowQualityMode indica WPFWPF al motore di rendering di passare da un algoritmo ottimizzato per la qualità a un algoritmo ottimizzato per la velocità durante l'elaborazione di immagini.LowQuality mode tells the WPFWPF rendering engine to switch from a quality-optimized algorithm to a speed-optimized algorithm when processing images.

Nell'esempio seguente viene illustrato come impostare BitmapScalingMode per un oggetto Image.The following example shows how to set the BitmapScalingMode for an image object.

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

CachingHintCachingHint

Per impostazione predefinita WPFWPF , non memorizza nella cache il contenuto TileBrush sottoposto a rendering DrawingBrush degli VisualBrushoggetti, ad esempio e.By default, WPFWPF does not cache the rendered contents of TileBrush objects, such as DrawingBrush and VisualBrush. Negli scenari statici in cui non è stato modificato né il TileBrush contenuto né l'uso di nella scena, questo ha senso, poiché consente di conservare la memoria video.In static scenarios where neither the contents nor use of the TileBrush in the scene is changing, this makes sense, since it conserves video memory. Non è molto utile quando un TileBrush oggetto con contenuto statico viene usato in modo non statico, ad esempio quando viene eseguito il mapping di un oggetto statico VisualBrush DrawingBrush o alla superficie di un oggetto 3D rotante.It does not make as much sense when a TileBrush with static content is used in a non-static way—for example, when a static DrawingBrush or VisualBrush is mapped to the surface of a rotating 3D object. Il comportamento predefinito di WPFWPF prevede di eseguire nuovamente il rendering dell'intero contenuto dell' DrawingBrush oggetto VisualBrush o per ogni frame, anche se il contenuto non è in corso di modifica.The default behavior of WPFWPF is to re-render the entire content of the DrawingBrush or VisualBrush for every frame, even though the content is unchanging.

Impostando la CachingHint proprietà RenderOptions dell'oggetto su Cache è possibile migliorare le prestazioni utilizzando le versioni memorizzate nella cache degli oggetti pennello affiancati.By setting the CachingHint property of the RenderOptions object to Cache you can increase performance by using cached versions of the tiled brush objects.

I CacheInvalidationThresholdMinimum valori CacheInvalidationThresholdMaximum delle proprietà e sono valori di dimensione relativa che determinano quando l' TileBrush oggetto deve essere rigenerato a causa di modifiche della scala.The CacheInvalidationThresholdMinimum and CacheInvalidationThresholdMaximum property values are relative size values that determine when the TileBrush object should be regenerated due to changes in scale. Se ad esempio si imposta la CacheInvalidationThresholdMaximum proprietà su 2,0, la cache TileBrush per deve essere rigenerata solo quando la dimensione supera il doppio della dimensione della cache corrente.For example, by setting the CacheInvalidationThresholdMaximum property to 2.0, the cache for the TileBrush only needs to be regenerated when its size exceeds twice the size of the current cache.

Nell'esempio seguente viene illustrato come utilizzare l'opzione relativa all'hint di memorizzazione DrawingBrushnella cache per un oggetto.The following example shows how to use the caching hint option for a 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)

Vedere ancheSee also