Condividi tramite


Ottimizzazione delle prestazioni tridimensionali di WPF

Quando si utilizza Windows Presentation Foundation (WPF) per compilare controlli 3D e includere scene 3D nelle applicazioni, è importante tenere in considerazione l'ottimizzazione delle prestazioni. In questo argomento viene fornito un elenco di classi e proprietà 3D che influenzano le prestazioni dell'applicazione, oltre a consigli per l'ottimizzazione delle prestazioni al momento del loro utilizzo.

In questo argomento si presuppone una conoscenza avanzata delle funzionalità tridimensionali di Windows Presentation Foundation (WPF). I suggerimenti presenti in questo documento si applicano al livello di rendering 2, generalmente definito hardware, che supporta il pixel shader versione 2.0 e il vertex shader versione 2.0. Per informazioni dettagliate, vedere Livelli di rendering della grafica.

Impatto sulle prestazioni: elevato

Proprietà

Consigli

Brush

Velocità del pennello (dalla più veloce alla più lenta):

SolidColorBrush

LinearGradientBrush

ImageBrush

DrawingBrush (memorizzato nella cache)

VisualBrush (memorizzato nella cache)

RadialGradientBrush

DrawingBrush (non memorizzato nella cache)

VisualBrush (non memorizzato nella cache)

ClipToBoundsProperty

Impostare Viewport3D.ClipToBounds su false quando non è necessario ritagliare in modo esplicito in Windows Presentation Foundation (WPF) il contenuto di un oggetto Viewport3D in base al rettangolo di Viewport3D. Le operazioni nell'area di visualizzazione con antialias di Windows Presentation Foundation (WPF) possono risultare molto lente e ClipToBounds è abilitato (lento) per impostazione predefinita su Viewport3D.

IsHitTestVisible

Impostare Viewport3D.IsHitTestVisible su false quando non è necessario tenere in considerazione in Windows Presentation Foundation (WPF) l contenuto di un oggetto Viewport3D quando si esegue l'hit test del mouse. L'hit test del contenuto 3D viene eseguito nel software e può risultare lento con mesh di grandi dimensioni. IsHitTestVisible è abilitata (lenta) per impostazione predefinita su Viewport3D.

GeometryModel3D

Creare modelli diversi solo quando sono necessari materiali o trasformazioni diverse. In caso contrario, tentare di riunire più istanze di GeometryModel3D con gli stessi materiali e trasformazioni in alcune istanze più grandi di GeometryModel3D e MeshGeometry3D.

MeshGeometry3D

L'animazione mesh, con la modifica dei singoli vertici di una mesh per singolo fotogramma, non è sempre efficace in Windows Presentation Foundation (WPF). Per ridurre al minimo l'impatto sulle prestazioni delle notifiche delle modifiche nel caso di modifica di ogni vertice, disconnettere la mesh dalla struttura ad albero visuale prima di eseguire la modifica per singolo vertice. Dopo aver modificato la mesh, riconnetterla alla struttura ad albero visuale. Tentare inoltre di ridurre al minimo la dimensione delle mesh che verranno animate in questo modo.

Anti-aliasing 3D

Per aumentare la velocità del rendering, disabilitare il campionamento multiplo su un oggetto Viewport3D impostando la proprietà associata EdgeMode su Aliased. Per impostazione predefinita, l'anti-aliasing 3D è disabilitato in Microsoft Windows XP e abilitato in Windows Vista con 4 campioni per pixel.

Text

Il testo attivo in una scena 3D (attivo perché si trova in DrawingBrush o VisualBrush) può risultare lento. In alternativa, provare a utilizzare immagini di testo (tramite RenderTargetBitmap) a meno che non si intenda modificare il testo.

TileBrush

Se è necessario utilizzare VisualBrush o DrawingBrush in una scena 3D poiché il contenuto del pennello non è statico, provare a memorizzare il pennello nella cache, impostando la proprietà associata CachingHint su Cache. Impostare le soglie minima e massima di annullamento della convalida della scala (con le proprietà associate CacheInvalidationThresholdMinimum e CacheInvalidationThresholdMaximum) in modo che i pennelli memorizzati nella cache non vengano rigenerati con troppa frequenza, mantenendo così il livello di qualità desiderato. Per impostazione predefinita, DrawingBrush e VisualBrush non vengono memorizzati nella cache, di conseguenza ogni volta che è necessario sottoporre nuovamente a rendering un elemento disegnato con il pennello, occorrerà prima eseguire un nuovo rendering dell'intero contenuto del pennello su una superficie intermedia.

BitmapEffect

BitmapEffect impone l'esecuzione del rendering di tutto il contenuto interessato senza accelerazione hardware. Per prestazioni ottimali, non utilizzare BitmapEffect.

Impatto sulle prestazioni: medio

Proprietà

Consigli

MeshGeometry3D

Quando una mesh viene definita da triangoli adiacenti con vertici condivisi i quali hanno le stesse coordinate di posizione, normale e trama, definire ogni vertice condiviso una sola volta, quindi definire i triangoli in base all'indice con la proprietà TriangleIndices.

ImageBrush

Provare a ridurre al minimo le dimensioni della trama quando si dispone di controllo esplicito sulla dimensione (quando si utilizza RenderTargetBitmap e/o ImageBrush). Si noti che le trame dalla risoluzione inferiore possono ridurre la qualità visiva, pertanto è opportuno trovare un compromesso adeguato tra qualità e prestazioni.

Opacità

Quando si esegue il rendering di contenuto tridimensionale semitrasparente (ad esempio reflection), utilizzare le proprietà di opacità su pennelli o materiali, tramite la proprietà Opacity o Color, anziché creare un oggetto Viewport3D semitrasparente separato impostando Viewport3D.Opacity su un valore inferiore a 1.

Viewport3D

Ridurre al minimo il numero di oggetti Viewport3D utilizzati in una scena. Inserire più modelli 3D nello stesso oggetto Viewport3D, anziché creare istanze di Viewport3D separate per ogni modello.

Freezable

In genere, è opportuno riutilizzare MeshGeometry3D, GeometryModel3D, pennelli e materiali. Tutti questi oggetti possono disporre di più elementi padre poiché sono derivati da Freezable.

Freezable

Chiamare il metodo Freeze sugli oggetti Freezable quando le proprietà rimangono invariate nell'applicazione. L'operazione di blocco può ridurre il working set e aumentare la velocità.

Brush

Utilizzare ImageBrush anziché VisualBrush o DrawingBrush quando il contenuto del pennello non viene modificato. Il contenuto 2D può essere convertito in un oggetto Image tramite RenderTargetBitmap e può quindi essere utilizzato in un oggetto ImageBrush.

BackMaterial

Non utilizzare BackMaterial a meno che non sia effettivamente necessario visualizzare le facce posteriori dell'oggetto GeometryModel3D.

Light

Velocità della luce (dalla più veloce alla più lenta):

AmbientLight

DirectionalLight

PointLight

SpotLight

MeshGeometry3D

Provare a mantenere le dimensioni della mesh entro i seguenti limiti:

Positions: 20.001 istanze di Point3D

TriangleIndices: 60.003 istanze di Int32

Material

Velocità del materiale (dalla più veloce alla più lenta):

EmissiveMaterial

DiffuseMaterial

SpecularMaterial

Brush

Windows Presentation Foundation (WPF) 3D non rifiuta esplicitamente i pennelli invisibili (pennelli per luce nera, pennelli di cancellazione e così via) in modo coerente. Valutare se è opportuno ometterli dalla scena.

MaterialGroup

Ogni Material in un oggetto MaterialGroup provoca un altro passaggio di rendering, pertanto l'inclusione di numerosi materiali, anche semplici, può aumentare drasticamente le richieste di riempimento alla GPU. Ridurre al minimo il numero di materiali in MaterialGroup.

Impatto sulle prestazioni: basso

Proprietà

Consigli

Transform3DGroup

Quando non è necessaria l'animazione o l'associazione dati, anziché utilizzare un gruppo di trasformazione che contiene più trasformazioni, utilizzare un solo oggetto MatrixTransform3D, impostandolo come prodotto di tutte le trasformazioni che, in caso contrario, esisterebbero in modo indipendente nel gruppo di trasformazione.

Light

Ridurre al minimo il numero di luci sulla scena. Un numero eccessivo di luci in una scena impone l'esecuzione del fallback al rendering software in Windows Presentation Foundation (WPF). I limiti sono di circa 110 oggetti DirectionalLight, 70 oggetti PointLight o 40 oggetti SpotLight.

ModelVisual3D

Separare gli oggetti in movimento da quelli statici inserendoli in istanze separate di ModelVisual3D. ModelVisual3D è più pesante di GeometryModel3D, poiché memorizza nella cache i limiti trasformati. GeometryModel3D è ottimizzato come modello, mentre ModelVisual3D è ottimizzato come nodo della scena. Utilizzare ModelVisual3D per inserire le istanze condivise di GeometryModel3D nella scena.

Light

Ridurre al minimo il numero di modifiche apportate al numero di luci nella scena. Ogni modifica del conteggio delle luci impone la rigenerazione e la ricompilazione dello shader, a meno che tale configurazione non fosse già presente in precedenza con la conseguente memorizzazione nella cache del relativo shader.

Luce

Le luci nere non sono visibili, ma vengono aggiunte in fase di rendering. Valutare se è opportuno ometterle.

MeshGeometry3D

Per ridurre al minimo il tempo di creazione di insiemi di grandi dimensioni in Windows Presentation Foundation (WPF), ad esempio Positions, Normals, TextureCoordinates e TriangleIndices di MeshGeometry3D, preimpostare le dimensioni degli insiemi prima della compilazione dei valori. Se possibile, passare ai costruttori degli insiemi strutture di dati precompilate, ad esempio matrici o elenchi.

Vedere anche

Concetti

Cenni preliminari sulla grafica tridimensionale