Ottimizzazione delle prestazioni: grafica bidimensionale e creazione di immagini

WPF offre un'ampia gamma di funzionalità grafiche e immagini 2D che possono essere ottimizzate per i requisiti dell'applicazione. Questo argomento fornisce informazioni sull'ottimizzazione delle prestazioni in queste aree.

Disegno e forme

WPF fornisce sia Drawing oggetti che Shape oggetti per rappresentare il contenuto grafico di disegno. Tuttavia, Drawing gli oggetti sono costrutti più semplici rispetto agli Shape oggetti e forniscono caratteristiche di prestazioni migliori.

Un Shape oggetto consente di disegnare una forma grafica sullo schermo. Poiché derivano dalla FrameworkElement classe , Shape gli oggetti possono essere usati all'interno di pannelli e la maggior parte dei controlli.

WPF offre diversi livelli di accesso ai servizi di grafica e rendering. Al livello superiore, Shape gli oggetti sono facili da usare e offrono molte funzionalità utili, ad esempio layout e gestione degli eventi. WPF offre numerosi oggetti shape pronti per l'uso. Tutti gli oggetti shape ereditano dalla Shape classe . Gli oggetti shape disponibili includono Ellipse, LinePath, Polygon, , Polylinee Rectangle.

Drawing gli oggetti, d'altra parte, non derivano dalla FrameworkElement classe e forniscono un'implementazione più leggera per il rendering di forme, immagini e testo.

Esistono quattro tipi di Drawing oggetti:

L'oggetto GeometryDrawing viene utilizzato per eseguire il rendering del contenuto geometry. La Geometry classe e le classi concrete che derivano da esso, ad esempio CombinedGeometry, EllipseGeometrye PathGeometry, forniscono un mezzo per il rendering della grafica 2D e forniscono il supporto di hit testing e ritaglio. Gli oggetti Geometry possono essere usati per definire, ad esempio, l'area di un controllo o l'area di ritaglio da applicare a un'immagine e possono essere semplici aree, quali rettangoli o cerchi, oppure aree composite create con due o più oggetti Geometry. È possibile creare aree geometriche più complesse combinando PathSegmentoggetti derivati da , ad esempio ArcSegment, BezierSegmente QuadraticBezierSegment.

Sulla superficie, la Geometry classe e la Shape classe sono simili. Entrambi vengono usati nel rendering della grafica 2D ed entrambi hanno classi concrete simili che derivano da esse, ad esempio e EllipseGeometryEllipse. Esistono tuttavia importanti differenze tra questi due set di classi. Per uno, la Geometry classe non dispone di alcune delle funzionalità della Shape classe, ad esempio la possibilità di disegnare se stessa. 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. Le proprietà di rendering, ad esempio riempimento, tratto e spessore del tratto si trovano nella classe che disegna l'oggetto geometry, mentre un oggetto shape contiene queste proprietà. Un modo per pensare a questa differenza è che un oggetto geometry definisce un'area, ad esempio un cerchio, mentre un oggetto forma definisce un'area, definisce il modo in cui tale area viene riempita e delineata e partecipa al sistema di layout.

Poiché Shape gli oggetti derivano dalla FrameworkElement classe , l'uso di tali oggetti può aggiungere un consumo di memoria significativamente maggiore nell'applicazione. Se in realtà non hai bisogno delle FrameworkElement funzionalità per il tuo contenuto grafico, prendi in considerazione l'uso degli oggetti più Drawing leggeri.

Per altre informazioni sugli oggetti, vedere Cenni preliminari sugli Drawing oggetti disegno.

Oggetto StreamGeometry

L'oggetto StreamGeometry è un'alternativa leggera alla PathGeometry creazione di forme geometriche. Usare un oggetto StreamGeometry quando è necessario descrivere una geometria complessa. StreamGeometry è ottimizzato per la gestione di molti PathGeometry oggetti e offre prestazioni migliori rispetto all'uso di molti singoli PathGeometry oggetti.

L'esempio seguente usa la sintassi degli attributi per creare un triangolo StreamGeometry 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>

Per altre informazioni sugli StreamGeometry oggetti, vedere Creare una forma usando un oggetto StreamGeometry.

Oggetti DrawingVisual

L'oggetto DrawingVisual è una classe di disegno leggera utilizzata per eseguire il rendering di forme, immagini o testo. Questa classe è considerata semplice perché non offre la gestione di layout o eventi, con un conseguente aumento delle prestazioni. Per questo motivo, i disegni sono ideali per sfondi e ClipArt. Per altre informazioni, vedere Uso degli oggetti DrawingVisual.

Immagini

L'immagine WPF offre un miglioramento significativo rispetto alle funzionalità di creazione dell'immagine nelle versioni precedenti di Windows. Le funzionalità di creazione dell'immagine, ad esempio la visualizzazione di una bitmap o l'uso di un'immagine in un controllo comune, sono state gestite principalmente dall'API (Microsoft Windows Graphics Device Interface) o dall'API (Application Programming Interface) di Microsoft Windows GDI+. Queste API hanno fornito funzionalità di imaging di base, ma senza funzionalità come il supporto per l'estendibilità del codec e il supporto di immagini ad alta fedeltà. Le API di imaging WPF sono state riprogettati per superare le carenze di GDI e GDI+ e offrono un nuovo set di API per visualizzare e usare immagini all'interno delle applicazioni.

Per ottenere prestazioni migliori durante l'uso di immagini, seguire questi consigli:

  • Se l'applicazione richiede la visualizzazione di immagini di anteprima, creare una versione ridotta dell'immagine. Per impostazione predefinita, WPF carica l'immagine e la decodifica alle dimensioni complete. Se si vuole solo una versione di anteprima dell'immagine, WPF non è necessario decodificare l'immagine alle dimensioni complete e quindi ridimensionarla fino a una dimensione di anteprima. Per evitare questo sovraccarico non necessario, è possibile richiedere a WPF di decodificare l'immagine in una dimensione di anteprima o richiedere a WPF di caricare un'immagine delle dimensioni dell'anteprima.

  • Decodificare sempre l'immagine con le dimensioni desiderate e non con quelle predefinite. Come accennato in precedenza, richiedere a WPF di decodificare l'immagine in base alle dimensioni desiderate e non alle dimensioni complete predefinite. In questo modo è possibile ridurre non solo il working set dell'applicazione ma anche la velocità di esecuzione.

  • Se possibile, combinare le immagini in un'unica immagine, come una pellicola cinematografica composta da più immagini.

  • Per altre informazioni, vedere Panoramica della creazione dell'immagine.

BitmapScalingMode

Quando si anima la scala di qualsiasi bitmap, l'algoritmo predefinito di ricampionamento delle immagini di alta qualità può talvolta utilizzare risorse di sistema sufficienti per causare una riduzione della frequenza dei fotogrammi, causando in modo efficace lo stub delle animazioni. Impostando la BitmapScalingMode proprietà dell'oggetto RenderOptions su LowQuality, è possibile creare un'animazione più fluida quando si ridimensiona una bitmap. LowQuality la modalità indica al motore di rendering WPF di passare da un algoritmo ottimizzato per la qualità a un algoritmo ottimizzato per la velocità durante l'elaborazione delle immagini.

Nell'esempio seguente viene illustrato come impostare l'oggetto BitmapScalingMode per un oggetto immagine.

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

Per impostazione predefinita, WPF non memorizza nella cache il contenuto sottoposto a rendering di TileBrush oggetti, ad esempio DrawingBrush e VisualBrush. Negli scenari statici in cui il contenuto o l'uso di TileBrush nella scena non cambiano, questo ha senso, poiché consente di risparmiare memoria video. Non ha senso quando un TileBrush oggetto con contenuto statico viene usato in modo non statico, ad esempio quando viene eseguito il mapping di un oggetto statico DrawingBrush o VisualBrush mappato alla superficie di un oggetto 3D rotante. Il comportamento predefinito di WPF consiste nel eseguire nuovamente il rendering dell'intero contenuto di DrawingBrush o VisualBrush per ogni fotogramma, anche se il contenuto non è modificabile.

Impostando la CachingHint proprietà dell'oggetto RenderOptions su Cache, è possibile migliorare le prestazioni usando le versioni memorizzate nella cache degli oggetti pennello affiancati.

I valori delle CacheInvalidationThresholdMinimum proprietà e CacheInvalidationThresholdMaximum sono valori di dimensioni relative che determinano quando l'oggetto TileBrush deve essere rigenerato a causa di modifiche nella scala. Ad esempio, impostando la CacheInvalidationThresholdMaximum proprietà su 2.0, la cache per l'unico TileBrush oggetto deve essere rigenerata quando le dimensioni superano il doppio delle dimensioni della cache corrente.

Nell'esempio seguente viene illustrato come usare l'opzione hint di memorizzazione nella cache per un oggetto 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)

Vedi anche