Condividi tramite


Ottimizzazione delle prestazioni: grafica bidimensionale e creazione di immagini

Aggiornamento: novembre 2007

WPF fornisce un'ampia gamma di funzionalità di grafica bidimensionale e di creazione dell'immagine che possono essere ottimizzate in base ai requisiti dell'applicazione. In questo argomento sono fornite informazioni sull'ottimizzazione delle prestazioni in tali aree.

Nel presente argomento sono contenute le seguenti sezioni.

  • Disegno e forme
  • Oggetti StreamGeometry
  • Oggetti DrawingVisual
  • Immagini
  • Argomenti correlati

Disegno e forme

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

Un oggetto Shape consente di disegnare una forma grafica sullo schermo. Dal momento che sono derivati dalla classe FrameworkElement, gli oggetti Shape possono essere utilizzati nei pannelli e nella maggior parte dei controlli.

In WPF vengono offerti molti livelli di accesso alla grafica e ai servizi di rendering. Al livello superiore, gli oggetti Shape sono facili da utilizzare e forniscono molte funzionalità utili, ad esempio la gestione del layout e degli eventi. WPF fornisce alcuni oggetti Shape pronti per l'uso. Tutti gli oggetti Shape ereditano dalla classe Shape. Gli oggetti Shape disponibili includono Ellipse, Line, Path, Polygon, Polylinee Rectangle.

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

Esistono quattro tipi di oggetti Drawing:

  • GeometryDrawing Consente di disegnare una forma.

  • ImageDrawing Consente di disegnare un'immagine.

  • GlyphRunDrawing Consente di disegnare un testo.

  • DrawingGroup Consente di eseguire altri disegni. Utilizzare un gruppo di disegni per combinare altri disegni in un unico disegno composto.

L'oggetto GeometryDrawing viene utilizzato per eseguire il rendering del contenuto della geometria. La classe Geometry e le classi concrete che derivano da essa, quali CombinedGeometry, EllipseGeometry e PathGeometry, forniscono un modo per eseguire il rendering di immagini bidimensionali, nonché per offrire il supporto per l'hit-testing e il ritaglio. Gli oggetti Geometry possono essere utilizzati 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. Combinando gli oggetti derivati da PathSegment, quali ArcSegment, BezierSegment e QuadraticBezierSegment, è possibile creare aree geometriche più complesse.

Apparentemente, la classe Geometry e la classe Shape sono abbastanza simili. Entrambe sono utilizzate per il rendering di immagini bidimensionali e dispongono di classi concrete derivate simili, ad esempio EllipseGeometry e Ellipse. Vi sono, tuttavia, alcune differenze rilevanti tra questi due insiemi di classi. La classe Geometry non dispone di alcune funzionalità della classe Shape, ad esempio la possibilità di disegnarsi. Per disegnare un oggetto Geometry, è necessario utilizzare un'altra classe, ad esempio DrawingContext, Drawing oppure Path (notare che Path è un oggetto Shape), al fine di eseguire l'operazione di disegno. Le proprietà di rendering, ad esempio il riempimento, il tratto e lo spessore del tratto si trovano nella classe che consente di disegnare l'oggetto Geometry, mentre un oggetto forma contiene queste proprietà. Questa differenza prevede, ad esempio, che un oggetto Geometry definisca un'area, ad esempio un cerchio, mentre un oggetto Shape definisce un'area, il modo in cui quest'area viene riempita e delineata e partecipa al sistema di layout.

Dal momento che gli oggetti Shape derivano dalla classe FrameworkElement, il loro utilizzo può aumentare in modo significativo il consumo della memoria dell'applicazione. Se non si necessita delle funzionalità dell'oggetto FrameworkElement per il contenuto grafico, prendere in considerazione l'utilizzo di oggetti Drawing più semplici.

Per ulteriori informazioni sugli oggetti Drawing, vedere Cenni preliminari sugli oggetti Drawing.

Oggetti StreamGeometry

L'oggetto StreamGeometry è un'alternativa più semplice all'oggetto PathGeometry per la creazione di forme geometriche. Utilizzare un oggetto StreamGeometry, se è necessario descrivere una geometria complessa. L'oggetto StreamGeometry è ottimizzato per la gestione di molti oggetti PathGeometry e offre prestazioni migliori, se confrontato con l'utilizzo di più oggetti PathGeometry singoli.

Nell'esempio riportato di seguito viene utilizzata la sintassi dell'attributo per creare un oggetto StreamGeometry triangolare in XAML.

<Page xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="https://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 Procedura: creare forme tramite un oggetto StreamGeometry.

Oggetti DrawingVisual

L'oggetto DrawingVisual rappresenta una classe di disegno semplificata utilizzata per eseguire il rendering di forme, immagini o testo. Questa classe è considerata semplice perché non fornisce la gestione del layout o degli eventi, migliorando in tal modo le prestazioni. Per questo motivo, i disegni sono ideali per gli sfondi e per ClipArt. Per ulteriori informazioni, vedere Utilizzo degli oggetti DrawingVisual.

Immagini

La creazione dell'immagine tramite WPF offre un miglioramento significativo rispetto alle funzionalità di creazione dell'immagine delle precedenti versioni di Windows. Le funzionalità di creazione dell'immagine, ad esempio la visualizzazione di una bitmap o l'utilizzo di un'immagine per un controllo comune, inizialmente erano gestiti dalle interfacce API (Application Programming Interface) Graphics Device Interface (GDI) o GDI+ di Microsoft Windows. Queste API fornivano la funzionalità di creazione dell'immagine di base, ma non erano dotate di funzioni quali il supporto per l'estendibilità dei codec e per immagini di elevata fedeltà. Le API per la creazione dell'immagine tramite WPF sono state riprogettate per risolvere i difetti delle interfacce GDI e GDI+ e per fornire un nuovo gruppo di API al fine di visualizzare e utilizzare immagini nelle applicazioni.

Per ottenere prestazioni migliori, in caso di utilizzo di immagini, attenersi alle indicazioni seguenti:

  • Se l'applicazione richiede la visualizzazione di immagini di anteprima, creare una versione ridotta dell'immagine. Per impostazione predefinita, in WPF, l'immagine viene caricata e decodificata con le dimensioni originali. Sebbene si desideri soltanto un'immagine di anteprima, in WPF, l'immagine viene comunque decodificata con le dimensioni originali, e successivamente, ridimensionata in base alle esigenze dell'anteprima. Per evitare questa operazione inutile, è possibile richiedere a WPF di decodificare l'immagine con le dimensioni dell'anteprima o di caricare l'immagine di anteprima.

  • Decodificare sempre l'immagine con le dimensioni desiderate e non con quelle predefinite. Pertanto, richiedere a WPF di effettuare la codifica secondo le dimensioni desiderate e non quelle predefinite. In tal modo, è possibile ridurre il working set dell'applicazione e la velocità di esecuzione.

  • Se possibile, unire le immagini in una singola immagine, ad esempio una striscia di pellicola composta da più immagini.

  • Per ulteriori informazioni, vedere Cenni preliminari sulla creazione dell'immagine.

BitmapScalingMode

Quando si aggiunge un'animazione alla scala di una bitmap, talvolta è possibile che l'algoritmo di ricampionamento delle immagini di elevata qualità determini il consumo di risorse di sistema fino a rallentare la frequenza di aggiornamento, causando l'irregolarità delle animazioni. Impostando la proprietà BitmapScalingMode dell'oggetto RenderOptions su LowQuality, è possibile creare un'animazione più uniforme, in caso di ridimensionamento di una bitmap. Durante l'elaborazione delle immagini, il modo LowQuality indica al motore di rendering di WPF di passare da un algoritmo ottimizzato dal punto di vista della qualità a uno ottimizzato dal punto di vista della velocità.

Nell'esempio riportato di seguito viene illustrato come impostare la proprietà BitmapScalingMode per un oggetto Image.

// Set the bitmap scaling mode for the image to render faster.
RenderOptions.SetBitmapScalingMode(MyImage, BitmapScalingMode.LowQuality);

CachingHint

Per impostazione predefinita, in WPF il contenuto degli oggetti TileBrush (ad esempio DrawingBrush e VisualBrush) sottoposto a rendering non viene memorizzato nella cache. In scenari statici in cui il contenuto e l'utilizzo dell'oggetto TileBrush rimangono invariati nella scena, tale comportamento è opportuno poiché consente di conservare la memoria video. Tale comportamento non ha senso se un oggetto TileBrush con contenuto statico viene utilizzato in modo non statico, ad esempio nel caso di un oggetto DrawingBrush o VisualBrush statico che viene sottoposto al mapping sulla superficie di un oggetto tridimensionale in rotazione. Il comportamento predefinito di WPF consiste nell'eseguire nuovamente il rendering dell'intero contenuto dell'oggetto DrawingBrush o VisualBrush per ogni fotogramma, anche se il contenuto rimane invariato.

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

I valori delle proprietà CacheInvalidationThresholdMinimum e CacheInvalidationThresholdMaximum sono valori di dimensione relativi che determinano il momento in cui è necessario rigenerare l'oggetto TileBrush a causa di modifiche in termini di ridimensionamento. Se, ad esempio, la proprietà CacheInvalidationThresholdMaximum è impostata su 2,0, è necessario rigenerare la cache per l'oggetto TileBrush solo quando la relativa dimensione supera di due volte la dimensione della cache corrente.

Nell'esempio seguente viene mostrato come utilizzare l'opzione relativa al suggerimento di memorizzazione nella cache per un oggetto DrawingBrush.

// Set the minimum and maximum relative sizes for regenerating the tiled brush.
RenderOptions.SetCacheInvalidationThresholdMinimum(drawingBrush, 0.5);
RenderOptions.SetCacheInvalidationThresholdMaximum(drawingBrush, 2.0);

// The tiled brush will be regenerated when the size is
//   0.5x, 0.25x (and so forth)
// and
//   2x, 4x, 8x (and so forth)
// of the original size.

// Set the caching hint option for the brush.
RenderOptions.SetCachingHint(drawingBrush, CachingHint.Cache);

Vedere anche

Concetti

Ottimizzazione delle prestazioni di applicazioni WPF

Pianificazione delle prestazioni dell'applicazione

Ottimizzazione delle prestazioni: sfruttare appieno l'hardware

Ottimizzazione delle prestazioni: layout e progettazione

Ottimizzazione delle prestazioni: comportamento degli oggetti

Ottimizzazione delle prestazioni: risorse di applicazioni

Ottimizzazione delle prestazioni: testo

Ottimizzazione delle prestazioni: associazione dati

Ottimizzazione delle prestazioni: altri suggerimenti

Strumenti e risorse relativi alle prestazioni WPF

Suggerimenti sulle animazioni