Condividi tramite


Ottimizzare le prestazioni 3D di WPF

Quando usi Windows Presentation Foundation (WPF) per compilare controlli 3D e includere scene 3D nelle tue applicazioni, è importante prendere in considerazione l'ottimizzazione delle prestazioni. In questo argomento viene fornito un elenco di classi e proprietà 3D che hanno implicazioni sulle prestazioni per l'applicazione, insieme alle raccomandazioni per ottimizzare le prestazioni quando vengono usate.

In questo argomento si presuppone una conoscenza avanzata delle funzionalità 3D di Windows Presentation Foundation (WPF). I suggerimenti in questo documento si applicano al "livello di rendering 2", definito approssimativamente come hardware che supporta pixel shader versione 2.0 e vertex shader versione 2.0. Per altri dettagli, vedere Livelli di rendering della grafica.

Impatto sulle prestazioni: Elevato

Proprietà Raccomandazione
Brush Velocità pennello (dal più veloce al più lento):

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 a false ogni volta che non è necessario che Windows Presentation Foundation (WPF) ritagli in modo esplicito il contenuto di un Viewport3D nel rettangolo del Viewport3D. Il ritaglio antialiased di Windows Presentation Foundation (WPF) può essere molto lento ed ClipToBounds è abilitato (lento) per impostazione predefinita su Viewport3D.
IsHitTestVisible Impostare Viewport3D.IsHitTestVisible su false, ogni volta che non è necessario che Windows Presentation Foundation (WPF) consideri il contenuto di un Viewport3D quando si esegue il test di rilevamento del mouse. Il contenuto 3D di hit testing viene eseguito nel software e può essere lento con mesh di grandi dimensioni. IsHitTestVisible è abilitato (lento) per impostazione predefinita in Viewport3D.
GeometryModel3D Creare modelli diversi solo quando richiedono materiali o trasformazioni diversi. In caso contrario, provare a unire molte GeometryModel3D istanze con gli stessi materiali e trasformazioni in poche istanze più grandi GeometryModel3D e MeshGeometry3D .
MeshGeometry3D L'animazione della mesh, che modifica i singoli vertici della mesh a ogni fotogramma, non è sempre efficiente in Windows Presentation Foundation (WPF). Per ridurre al minimo l'impatto sulle prestazioni delle notifiche di modifica quando ogni vertice viene modificato, scollegare la mesh dalla struttura ad albero visuale prima di eseguire la modifica per vertice. Dopo aver modificato la mesh, ricollegarla all'albero visivo. Inoltre, provare a ridurre al minimo le dimensioni delle mesh che verranno animate in questo modo.
Antialiasing 3D Per aumentare la velocità di rendering, disabilitare il multicampionamento su un Viewport3D impostando la proprietà EdgeMode associata su Aliased. Per impostazione predefinita, l'antialiasing 3D è abilitato in Windows con 4 campioni per pixel.
Testo Il testo in tempo reale in una scena 3D (in tempo reale perché è in un DrawingBrush o VisualBrush) può essere lento. Cerca di usare invece immagini del testo (tramite RenderTargetBitmap) a meno che il testo non cambi.
TileBrush Se è necessario usare un VisualBrush o un DrawingBrush in una scena 3D perché il contenuto del pennello non è statico, memorizzate nella cache il pennello (impostando la proprietà associata CachingHint a Cache). Impostare le soglie di invalidazione della scala minima e massima (con le proprietà CacheInvalidationThresholdMinimum associate e CacheInvalidationThresholdMaximum) in modo che i pennelli memorizzati nella cache non vengano rigenerati troppo frequentemente, mantenendo comunque il livello di qualità desiderato. Per impostazione predefinita, DrawingBrush e VisualBrush non vengono memorizzati nella cache, ovvero ogni volta che un elemento disegnato con il pennello deve essere nuovamente sottoposto a rendering, l'intero contenuto del pennello deve essere prima sottoposto a rendering in una superficie intermedia.
BitmapEffect BitmapEffect obbliga il rendering di tutto il contenuto interessato senza accelerazione hardware. Per ottenere prestazioni ottimali, non usare BitmapEffect.

Impatto sulle prestazioni: medio

Proprietà Raccomandazione
MeshGeometry3D Quando una mesh è definita come triangoli adiacenti con vertici condivisi e quei vertici hanno la stessa posizione, le stesse coordinate normali e di trama, definire ciascun vertice condiviso una sola volta, quindi definire i triangoli in base agli indici con TriangleIndices.
ImageBrush Cerca di minimizzare le dimensioni delle trame quando hai il controllo esplicito sulle dimensioni (quando usi un RenderTargetBitmap e/o un ImageBrush). Si noti che le trame con risoluzione inferiore possono ridurre la qualità visiva, quindi cercare di trovare il giusto equilibrio tra qualità e prestazioni.
Opacità Quando si esegue il rendering del contenuto 3D traslucente (ad esempio i riflessi), usare le proprietà di opacità su pennelli o materiali (tramite Opacity o Color) anziché creare una traslucente Viewport3D separata impostando Viewport3D.Opacity su un valore minore di 1.
Viewport3D Ridurre al minimo il numero di Viewport3D oggetti usati in una scena. Inserire molti modelli 3D nello stesso Viewport3D anziché creare istanze Viewport3D separate per ogni modello.
Freezable In genere è utile riutilizzare MeshGeometry3D, , GeometryModel3Dpennelli e materiali. Tutti sono multiparentabili perché sono derivati da Freezable.
Freezable Chiamare il Freeze metodo su Freezables quando le relative proprietà rimarranno invariate nell'applicazione. Il congelamento può ridurre il set di lavoro e aumentare la velocità.
Brush Usare ImageBrush invece di VisualBrush o DrawingBrush quando il contenuto del pennello non cambierà. Il contenuto 2D può essere convertito in un oggetto Image tramite RenderTargetBitmap e quindi usato in un oggetto ImageBrush.
BackMaterial Non usare BackMaterial a meno che non sia effettivamente necessario visualizzare le facce posteriori di GeometryModel3D.
Light Velocità della luce (più veloce da più lenta):

AmbientLight

DirectionalLight

PointLight

SpotLight
MeshGeometry3D Provare a mantenere le dimensioni delle mesh al di sotto di questi limiti:

Positions: 20.001 Point3D istanze

TriangleIndices: 60.003 Int32 istanze
Material Velocità del materiale (più veloce da più lenta):

EmissiveMaterial

DiffuseMaterial

SpecularMaterial
Brush Windows Presentation Foundation (WPF) 3D non opta per pennelli invisibili (pennelli di ambiente neri, pennelli chiari e così via) in modo coerente. È consigliabile ometterli dalla scena.
MaterialGroup Ogni Material in un MaterialGroup causa un altro passaggio di rendering, quindi includere molti materiali, anche quelli semplici, può aumentare notevolmente le richieste di riempimento della GPU. Ridurre al minimo il numero di materiali nell'oggetto MaterialGroup.

Impatto sulle prestazioni: Basso

Proprietà Raccomandazione
Transform3DGroup Quando non è necessaria l'animazione o il data binding, invece di usare un gruppo di trasformazione contenente più trasformazioni, usare un singolo MatrixTransform3Delemento , impostandolo come prodotto di tutte le trasformazioni che altrimenti esisterebbero in modo indipendente nel gruppo di trasformazione.
Light Ridurre al minimo il numero di luci nella scena. Troppe luci in una scena costringeranno Windows Presentation Foundation (WPF) a ricorrere al rendering software. I limiti sono circa 110 DirectionalLight oggetti, 70 PointLight oggetti o 40 SpotLight oggetti.
ModelVisual3D Separare gli oggetti mobili dagli oggetti statici inserendoli in istanze separate ModelVisual3D . ModelVisual3D è "più pesante" rispetto a GeometryModel3D perché memorizza nella cache i limiti trasformati. GeometryModel3D è ottimizzato per essere un modello; ModelVisual3D è ottimizzato per essere un nodo della scena. Usare ModelVisual3D per inserire istanze condivise di GeometryModel3D nella scena.
Light Ridurre al minimo il numero di volte in cui si cambia il numero di luci nella scena. Ogni modifica del conteggio delle luci forza la rigenerazione e la ricompilazione dello shader, a meno che tale configurazione non esista in precedenza (e quindi ne sia stata memorizzata la cache).
Leggero Le luci nere non saranno visibili, ma aggiungeranno al tempo di rendering; considerare di ometterli.
MeshGeometry3D Per ridurre al minimo il tempo di costruzione di raccolte di grandi dimensioni in Windows Presentation Foundation (WPF), come in una MeshGeometry3D, Positions, Normals, TextureCoordinates e TriangleIndices, pre-dimensionare le raccolte prima del popolamento dei valori. Se possibile, passare ai costruttori delle raccolte strutture di dati prepopolate, come una matrice o un elenco.

Vedere anche