Condividi tramite


Ottimizzazione delle prestazioni: grafica 2D e creazione di immagini

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

Disegno e forme

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

Un Shape consente di disegnare una forma grafica sullo schermo. Poiché derivano dalla classe FrameworkElement, gli oggetti Shape 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, gli oggetti Shape sono facili da usare e offrono molte funzionalità utili, ad esempio layout e gestione degli eventi. WPF offre numerosi oggetti forma pronti all'uso. Tutti gli oggetti di forma ereditano dalla classe Shape. Gli oggetti shape disponibili includono Ellipse, Line, Path, Polygon, Polylinee Rectangle.

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

Esistono quattro tipi di oggetti Drawing:

L'oggetto GeometryDrawing viene utilizzato per rendere il contenuto di geometria. La classe Geometry e le classi concrete che ne derivano, 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 geometrici possono essere usati per definire l'area di un controllo, ad esempio, o per definire l'area di ritaglio da applicare a un'immagine. Gli oggetti geometrici possono essere aree semplici, come rettangoli e cerchi, oppure aree composte create da due o più oggetti geometrici. È possibile creare aree geometriche più complesse combinando oggetti derivati da PathSegment, ad esempio ArcSegment, BezierSegmente QuadraticBezierSegment.

Sulla superficie, la classe Geometry e la classe Shape sono simili. Entrambi vengono usati nel rendering della grafica 2D ed entrambi hanno classi concrete simili che derivano da esse, ad esempio EllipseGeometry e Ellipse. Esistono tuttavia differenze importanti tra questi due set di classi. Ad esempio, la classe Geometry non dispone di alcune funzionalità della classe Shape, ad esempio la possibilità di disegnare se stessa. Per disegnare un oggetto geometry, è necessario utilizzare un'altra classe, ad esempio DrawingContext, Drawing o Path (vale la pena notare che path è una forma) per 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 concepire questa differenza è che un oggetto geometrico definisce una regione, ad esempio un cerchio, mentre un oggetto forma non solo definisce una regione, ma stabilisce anche come essa viene riempita e delineata, oltre a partecipare al sistema di layout.

Poiché Shape oggetti derivano dalla classe FrameworkElement, l'uso di tali oggetti può aggiungere un consumo di memoria significativamente maggiore nell'applicazione. Se in realtà non sono necessarie le funzionalità di FrameworkElement per il contenuto grafico, è consigliabile usare gli oggetti Drawing più leggeri.

Per ulteriori informazioni sugli oggetti Drawing, vedere la Panoramica degli oggetti di disegno .

Oggetti StreamGeometry

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

L'esempio seguente usa la sintassi degli attributi per creare un StreamGeometry triangolare 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 ulteriori informazioni sugli oggetti StreamGeometry, vedere Creare una forma utilizzando StreamGeometry.

Oggetti DrawingVisual

L'oggetto DrawingVisual è una classe di disegno leggera utilizzata per eseguire il rendering di forme, immagini o testo. Questa classe è considerata leggera perché non fornisce layout o gestione degli eventi, migliorandone le prestazioni. Per questo motivo, i disegni sono ideali per sfondi e clipart. Per altre informazioni, vedere Using DrawingVisual Objects.

Immagini

L'elaborazione delle immagini di WPF offre un miglioramento significativo rispetto alle capacità di imaging 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 mancavano di caratteristiche come l'estendibilità dei codec e la capacità di supportare 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.

Quando si usano le immagini, prendere in considerazione i consigli seguenti per ottenere prestazioni migliori:

  • Se l'applicazione richiede di visualizzare immagini di anteprima, è consigliabile creare una versione ridotta dell'immagine. Per impostazione predefinita, WPF carica l'immagine e la decodifica alle dimensioni complete. Se vuoi solo una versione in miniatura dell'immagine, WPF decodifica inutilmente l'immagine alle dimensioni complete e poi la riduce 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.

  • Decodifica sempre l'immagine in base alle dimensioni desiderate e non alle dimensioni predefinite. Come accennato in precedenza, richiedere a WPF di decodificare l'immagine in base alle dimensioni desiderate e non alle dimensioni complete predefinite. Si ridurrà non solo il working set dell'applicazione, ma anche la velocità di esecuzione.

  • Se possibile, combinare le immagini in un'unica immagine, ad esempio una striscia di film composta da più immagini.

  • Per ulteriori informazioni, vedere Imaging Overview.

Modalità di Ridimensionamento Bitmap

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 a ridurre la frequenza dei fotogrammi, determinando il rallentamento delle animazioni. Impostando la proprietà BitmapScalingMode dell'oggetto RenderOptions su LowQuality, è possibile creare un'animazione più fluida quando si ridimensiona una bitmap. LowQuality 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 il 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 oggetti TileBrush, ad esempio DrawingBrush e VisualBrush. Negli scenari statici in cui il contenuto o l'uso del TileBrush nella scena non cambiano, questo ha senso, poiché consente di risparmiare memoria video. Non ha molto senso quando uno TileBrush con contenuto statico viene usato in modo non statico, ad esempio quando uno DrawingBrush statico o uno VisualBrush vengono mappati sulla superficie di un oggetto 3D rotante. Il comportamento predefinito di WPF consiste nel eseguire nuovamente il rendering dell'intero contenuto del DrawingBrush o VisualBrush per ogni fotogramma, anche se il contenuto non è modificabile.

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

I valori delle proprietà CacheInvalidationThresholdMinimum 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 proprietà CacheInvalidationThresholdMaximum su 2.0, la cache per il TileBrush deve essere rigenerata solo quando le dimensioni superano il doppio delle dimensioni della cache corrente.

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