Ottimizzazione delle prestazioni tridimensionali 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à | Recommendation |
---|---|
Brush | Velocità pennello (più veloce da rallentare): SolidColorBrush LinearGradientBrush ImageBrush DrawingBrush (memorizzato nella cache) VisualBrush (memorizzato nella cache) RadialGradientBrush DrawingBrush (non memorizzato nella cache) VisualBrush (non memorizzato nella cache) |
ClipToBoundsProperty | Impostare su Viewport3D.ClipToBounds false ogni volta che non è necessario che Windows Presentation Foundation (WPF) ritaglii in modo esplicito il contenuto di un oggetto Viewport3D nel rettangolo viewport3D. Il ritaglio antialiased di Windows Presentation Foundation (WPF) può essere molto lento ed ClipToBounds è abilitato (lento) per impostazione predefinita su Viewport3D. |
IsHitTestVisible | Impostare su Viewport3D.IsHitTestVisible false ogni volta che non è necessario Windows Presentation Foundation (WPF) per considerare il contenuto di un oggetto durante l'esecuzione di hit Viewport3D test 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 mesh, che modifica i singoli vertici di una mesh su base 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 alla struttura ad albero visuale. 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 live in una scena 3D (live perché è in un DrawingBrush o VisualBrush) può essere lento. Provare a usare invece immagini del testo (tramite RenderTargetBitmap) a meno che il testo non cambierà. |
TileBrush | Se è necessario usare o VisualBrushDrawingBrush in una scena 3D perché il contenuto del pennello non è statico, provare a memorizzare nella cache il pennello (impostando la proprietà CachingHint associata su 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 forza il rendering di tutto il contenuto interessato senza accelerazione hardware. Per ottenere prestazioni ottimali, non usare BitmapEffect. |
Impatto sulle prestazioni: medio
Proprietà | Recommendation |
---|---|
MeshGeometry3D | Quando una mesh è definita come triangoli di abutting con vertici condivisi e tali vertici hanno la stessa posizione, coordinate normali e di trama, definire ogni vertice condiviso una sola volta e quindi definire i triangoli in base all'indice con TriangleIndices. |
ImageBrush | Provare a ridurre al minimo le dimensioni delle trame quando si ha il controllo esplicito sulle dimensioni (quando si usa 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ò diminuire il working set 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 posteriore 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 | Ognuno Material di essi MaterialGroup causa un altro passaggio di rendering, quindi, inclusi molti materiali, anche materiali semplici, può aumentare notevolmente le richieste di riempimento sulla GPU. Ridurre al minimo il numero di materiali nell'oggetto MaterialGroup. |
Impatto sulle prestazioni: Basso
Proprietà | Recommendation |
---|---|
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 forzano windows Presentation Foundation (WPF) a eseguire il fallback 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 al fatto che GeometryModel3D 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), ad esempio meshGeometry3D , PositionsNormals, TextureCoordinatese TriangleIndices, antepone le raccolte prima del popolamento dei valori. Se possibile, passare i costruttori delle raccolte prepopolati strutture di dati, ad esempio matrici o elenchi. |
Vedi anche
.NET Desktop feedback