Ottimizzazione delle prestazioni: grafica bidimensionale 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

WPFWPF mette Drawing e Shape oggetti per rappresentare il contenuto di disegno con interfaccia grafico. provides both Drawing and Shape objects to represent graphical drawing content. Tuttavia, Drawing gli oggetti sono costrutti più semplici rispetto Shape oggetti e fornire prestazioni migliori.However, Drawing objects are simpler constructs than Shape objects and provide better performance characteristics.

Oggetto Shape consente di disegnare una forma grafica sullo schermo.A Shape allows you to draw a graphical shape to the screen. Dal momento che sono derivati dal FrameworkElement (classe), Shape oggetti possono essere utilizzati nei pannelli e nella 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 utilizzare e forniscono numerose funzionalità, quali 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 la Shape classe.All shape objects inherit from the Shape class. Gli oggetti shape disponibili includono Ellipse, Line, Path, Polygon, Polyline, e Rectangle.Available shape objects include Ellipse, Line, Path, Polygon, Polyline, and Rectangle.

Drawing gli oggetti, invece, non derivare il FrameworkElement classe e fornisce un'implementazione più semplice per il rendering 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:

Il GeometryDrawing oggetto viene utilizzato per il rendering del contenuto di geometria.The GeometryDrawing object is used to render geometry content. Il Geometry classe e le classi concrete che derivano da essa, ad esempio CombinedGeometry, EllipseGeometry, e PathGeometry, forniscono un mezzo per il rendering della grafica 2D, nonché per offrire hit testing e il supporto di 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ù complesse combinando PathSegment-derivare gli oggetti, ad esempio ArcSegment, BezierSegment, e QuadraticBezierSegment.More complex geometric regions can be created by combining PathSegment-derived objects, such as ArcSegment, BezierSegment, and QuadraticBezierSegment.

Nell'area della Geometry classe e Shape sono molto simili.On the surface, the Geometry class and the Shape class are quite similar. Entrambi vengono utilizzati per il rendering di grafica 2D e dispongono di classi concrete simili che ne derivano, 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 una, il Geometry classe non dispone di alcune delle funzionalità del Shape classe, ad esempio la possibilità di disegno.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 oggetti derivano il FrameworkElement (classe), utilizzarle può aggiungere significativamente maggiore 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 si necessita di FrameworkElement funzionalità per il contenuto del grafico, è consigliabile utilizzare lo spessore del bordo più chiaro Drawing oggetti.If you really do not need the FrameworkElement features for your graphical content, consider using the lighter-weight Drawing objects.

Per ulteriori informazioni su Drawing degli oggetti, vedere panoramica sugli oggetti disegno.For more information on Drawing objects, see Drawing Objects Overview.

Oggetto StreamGeometryStreamGeometry Objects

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

L'esempio seguente usa la sintassi degli attributi per creare un oggetto triangolare StreamGeometry in XAMLXAML.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 ulteriori informazioni su StreamGeometry degli oggetti, vedere creare una forma utilizzando un oggetto StreamGeometry.For more information on StreamGeometry objects, see Create a Shape Using a StreamGeometry.

Oggetti DrawingVisualDrawingVisual Objects

Il DrawingVisual oggetto è una classe utilizzata per eseguire il rendering di testo, immagini o forme di disegno semplificata.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

Le funzionalità per la creazione di immagini di WPFWPF offrono miglioramenti significativi rispetto alle funzionalità per la creazione di immagini delle precedenti versioni di WindowsWindows.WPFWPF imaging provides a significant improvement over the imaging capabilities in previous versions of WindowsWindows. 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 il BitmapScalingMode proprietà del RenderOptions oggetto LowQuality quando si ridimensiona una bitmap, è possibile creare un'animazione più uniforme.By setting the BitmapScalingMode property of the RenderOptions object to LowQuality you can create a smoother animation when scaling a bitmap. LowQuality modalità indica la WPFWPF motore di rendering per passare da un algoritmo di ottimizzazione per la qualità a un algoritmo di ottimizzazione 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 il 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 memorizza nella cache il contenuto viene eseguito il rendering di TileBrush oggetti, ad esempio DrawingBrush e VisualBrush.By default, WPFWPF does not cache the rendered contents of TileBrush objects, such as DrawingBrush and VisualBrush. Negli scenari statici in cui il contenuto e l'utilizzo del TileBrush nella scena, in questo 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 risulta ha senso se un TileBrush con contenuto statico viene utilizzato in modo non statico, ad esempio, quando un valore statico DrawingBrush o VisualBrush viene eseguito il mapping all'area di un oggetto di rotazione 3D.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 consiste nell'eseguire nuovamente il rendering dell'intero contenuto del DrawingBrush o VisualBrush di ogni frame, anche se il contenuto è immutabile.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 il CachingHint proprietà del RenderOptions oggetto Cache è possibile migliorare le prestazioni con le versioni memorizzate nella cache di 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.

Il CacheInvalidationThresholdMinimum e CacheInvalidationThresholdMaximum i valori delle proprietà sono valori di dimensione relativa che determinano quando il TileBrush oggetto deve essere rigenerato a causa di modifiche nella 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. Ad esempio, impostando il CacheInvalidationThresholdMaximum proprietà 2.0, la cache per il TileBrush deve solo essere rigenerate quando le dimensioni superano due volte la 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 di hint per la memorizzazione nella cache per un DrawingBrush.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

Ottimizzazione delle prestazioni di applicazioni WPFOptimizing WPF Application Performance
Pianificazione delle prestazioni dell'applicazionePlanning for Application Performance
Sfruttare appieno l'hardwareTaking Advantage of Hardware
Ottimizzazione delle prestazioni: layout e progettazioneLayout and Design
Comportamento dell'oggettoObject Behavior
Risorse di applicazioniApplication Resources
perText
Data bindingData Binding
Altri suggerimenti relativi alle prestazioniOther Performance Recommendations
Suggerimenti sulle animazioniAnimation Tips and Tricks