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
.NET Desktop feedback