Condividi tramite


Ottimizzazione delle prestazioni: grafica bidimensionale e creazione di immagini

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 varie funzionalità utili, ad esempio il layout e la gestione degli eventi. WPF offre vari oggetti forma pronti all'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. Se è necessario descrivere una geometria complessa, utilizzare StreamGeometry. 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 e fluida quando si ridimensiona una bitmap. La modalità LowQuality consente 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 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)
// 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. Negli 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 mappato alla superficie di un oggetto tridimensionale rotante. 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.

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

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

Suggerimenti sulle animazioni