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 |
Velocità del pennello (dalla più veloce alla più lenta): DrawingBrush (memorizzato nella cache) VisualBrush (memorizzato nella cache) DrawingBrush (non memorizzato nella cache) VisualBrush (non memorizzato nella cache) |
|
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. |
|
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. |
|
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. |
|
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. |
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 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 |
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. |
|
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. |
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. |
|
In genere, è opportuno riutilizzare MeshGeometry3D, GeometryModel3D, pennelli e materiali. Tutti questi oggetti possono disporre di più elementi padre poiché sono derivati da 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à. |
|
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. |
|
Non utilizzare BackMaterial a meno che non sia effettivamente necessario visualizzare le facce posteriori dell'oggetto GeometryModel3D. |
|
Velocità della luce (dalla più veloce alla più lenta): |
|
Provare a mantenere le dimensioni della mesh entro i seguenti limiti: Positions: 20.001 istanze di Point3D TriangleIndices: 60.003 istanze di Int32 |
|
Velocità del materiale (dalla più veloce alla più lenta): |
|
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. |
|
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 |
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. |
|
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. |
|
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. |
|
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. |
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. |