Dela via


Maximera WPF 3D-prestanda

När du använder Windows Presentation Foundation (WPF) för att skapa 3D-kontroller och inkludera 3D-scener i dina program är det viktigt att överväga prestandaoptimering. Det här avsnittet innehåller en lista över 3D-klasser och egenskaper som har prestandakonsekvenser för ditt program, tillsammans med rekommendationer för att optimera prestanda när du använder dem.

Det här avsnittet förutsätter en avancerad förståelse av 3D-funktioner i Windows Presentation Foundation (WPF). Förslagen i det här dokumentet gäller för "renderingsnivå 2" – ungefär definierad som maskinvara som stöder pixelskuggning version 2.0 och hörnskuggning version 2.0. Mer information finns i grafikrenderingsnivåer.

Prestandapåverkan: Hög

Egenskap Rekommendation
Brush Penselhastighet (snabbast till långsammast):

SolidColorBrush

LinearGradientBrush

ImageBrush

DrawingBrush (cachelagrad)

VisualBrush (cachelagrad)

RadialGradientBrush

DrawingBrush (ej tillgänglig)

VisualBrush (ej tillgänglig)
ClipToBoundsProperty Ställ in Viewport3D.ClipToBounds på false när du inte behöver låta Windows Presentation Foundation (WPF) uttryckligen klippa ut innehållet i en Viewport3D till Viewport3D:s rektangel. Antialiaserat urklipp i Windows Presentation Foundation (WPF) kan vara mycket långsamt och ClipToBounds är aktiverat (långsamt) som standard på Viewport3D.
IsHitTestVisible Ställ in Viewport3D.IsHitTestVisible på false när du inte behöver Windows Presentation Foundation (WPF) för att ta hänsyn till innehållet i en Viewport3D när du utför musträffstestning. Träfftestning av 3D-innehåll görs i programvara och kan vara långsamt med stora nät. IsHitTestVisible är aktiverat (långsamt) som standard på Viewport3D.
GeometryModel3D Skapa endast olika modeller när de kräver olika material eller transformeringar. Annars kan du försöka kombinera många GeometryModel3D-instansar med samma material och transformeringar till några större GeometryModel3D- och MeshGeometry3D-instansar.
MeshGeometry3D Mesh-animering – att ändra enskilda hörn i ett nät per bildruta – är inte alltid effektivt i Windows Presentation Foundation (WPF). Om du vill minimera prestandapåverkan för ändringsmeddelanden när varje hörn ändras kopplar du bort nätet från det visuella trädet innan du utför ändringar per hörn. När nätet har ändrats återfäster du det till det visuella trädet igen. Försök också att minimera storleken på nät som kommer att animeras på detta sätt.
3D-kantutjämning Om du vill öka återgivningshastigheten inaktiverar du multisampling på en Viewport3D genom att ange den anslutna egenskapen EdgeMode till Aliased. Som standard är 3D-antialiasering aktiverat i Windows med 4 exempel per pixel.
Text Livetext i en 3D-scen (dynamisk eftersom den ligger i en DrawingBrush eller VisualBrush) kan vara långsam. Försök att använda bilder av texten i stället (via RenderTargetBitmap) om inte texten ändras.
TileBrush Om du måste använda en VisualBrush eller en DrawingBrush i en 3D-scen eftersom penselns innehåll inte är statiskt kan du prova att cachelagra penseln (ange den anslutna egenskapen CachingHint till Cache). Ange tröskelvärdena för minsta och högsta skalinvalidering (med de anslutna egenskaperna CacheInvalidationThresholdMinimum och CacheInvalidationThresholdMaximum) så att de cachelagrade penslarna inte behöver återskapas för ofta, samtidigt som önskad kvalitetsnivå bibehålls. Som standard cachelagras inte DrawingBrush och VisualBrush, vilket innebär att varje gång något målat med penseln måste återges igen måste hela innehållet i penseln först återges på nytt till en mellanliggande yta.
BitmapEffect BitmapEffect tvingar allt innehåll som påverkas att återges utan maskinvaruacceleration. Använd inte BitmapEffectför bästa prestanda.

Prestandapåverkan: Medel

Egenskap Rekommendation
MeshGeometry3D När ett nät definieras som intill varandra trianglar med delade hörn och dessa hörn har samma position, normala koordinater och strukturkoordinater, definierar du endast varje delat hörn en gång och definierar sedan trianglar efter index med TriangleIndices.
ImageBrush Försök att minimera texturstorlekarna när du har explicit kontroll över storleken (när du använder en RenderTargetBitmap och/eller en ImageBrush). Observera att textur med lägre upplösning kan minska den visuella kvaliteten, så försök att hitta rätt balans mellan kvalitet och prestanda.
Ogenomskinlighet När du återger genomskinligt 3D-innehåll (till exempel reflektioner) använder du egenskaperna för ogenomskinlighet på penslar eller material (via Opacity eller Color) i stället för att skapa en separat genomskinlig Viewport3D genom att ange Viewport3D.Opacity till ett värde som är mindre än 1.
Viewport3D Minimera antalet Viewport3D objekt som du använder i en scen. Placera många 3D-modeller i samma Viewport3D i stället för att skapa separata Viewport3D-instanser för varje modell.
Freezable Vanligtvis är det fördelaktigt att återanvända MeshGeometry3D, GeometryModel3D, penslar och material. Alla är multiparentable eftersom de härleds från Freezable.
Freezable Anropa metoden Freeze på Freezables när deras egenskaper förblir oförändrade i ditt program. Frysning kan minska arbetsmängden och öka hastigheten.
Brush Använd ImageBrush i stället för VisualBrush eller DrawingBrush när innehållet i penseln inte ändras. 2D-innehåll kan konverteras till en Image via RenderTargetBitmap och sedan användas i en ImageBrush.
BackMaterial Använd inte BackMaterial om du inte faktiskt behöver se de bakre sidorna på din GeometryModel3D.
Light Ljus hastighet (snabbast till långsammast):

AmbientLight

DirectionalLight

PointLight

SpotLight
MeshGeometry3D Försök att hålla maskstorlekarna under dessa gränser:

Positions: 20 001 Point3D instanser

TriangleIndices: 60 003 Int32 förekomster
Material Materialhastighet (snabbast till långsammast):

EmissiveMaterial

DiffuseMaterial

SpecularMaterial
Brush Windows Presentation Foundation (WPF) 3D väljer inte bort osynliga penslar (svarta omgivande penslar, tydliga penslar osv.) på ett konsekvent sätt. Överväg att utelämna dessa från din scen.
MaterialGroup Varje Material i en MaterialGroup orsakar ett annat renderingspass, så att inkludera många material, även enkla material, kan dramatiskt öka fyllningskraven på din GPU. Minimera antalet material i din MaterialGroup.

Prestandapåverkan: Låg

Egenskap Rekommendation
Transform3DGroup När du inte behöver animering eller databindning, i stället för att använda en transformeringsgrupp som innehåller flera transformeringar, använder du en enda MatrixTransform3Doch ställer in den som produkt för alla transformeringar som annars skulle finnas oberoende av varandra i transformeringsgruppen.
Light Minimera antalet lampor i din scen. För många lampor i en scen tvingar Windows Presentation Foundation (WPF) att återgå till programvarurendering. Gränserna är ungefär 110 DirectionalLight objekt, 70 PointLight objekt eller 40 SpotLight objekt.
ModelVisual3D Separera flyttande objekt från statiska objekt genom att placera dem i separata ModelVisual3D instanser. ModelVisual3D är "tyngre" än GeometryModel3D eftersom det cachelagrar transformerade gränser. GeometryModel3D är optimerad för att vara en modell. ModelVisual3D är optimerad för att vara en scennod. Använd ModelVisual3D för att placera delade instanser av GeometryModel3D i scenen.
Light Minimera antalet gånger du ändrar antalet lampor i scenen. Varje ändring av ljusantalet tvingar fram en skuggningsregenerering och omkompilering om inte konfigurationen har funnits tidigare (och därmed har dess skuggning cachelagrats).
Ljus Svarta lampor kommer inte att synas, men de kommer att öka återgivningstiden. Överväg att ta bort dem.
MeshGeometry3D För att minimera byggtiden för stora samlingar i Windows Presentation Foundation (WPF), t.ex. MeshGeometry3D:s Positions, Normals, TextureCoordinatesoch TriangleIndices, förbered storleken på samlingarna innan de fylls med värden. Skicka, om möjligt, förifyllda datastrukturer såsom matriser eller listor till samlingarnas konstruktorer.

Se även