Maximalizace výkonu WPF 3D
Při vytváření 3D ovládacích prvků a zahrnutí 3D scén do aplikací pomocí technologie Windows Presentation Foundation (WPF) je důležité zvážit optimalizaci výkonu. Toto téma obsahuje seznam 3D tříd a vlastností, které mají vliv na výkon vaší aplikace, spolu s doporučeními pro optimalizaci výkonu při jejich použití.
Toto téma předpokládá pokročilé porozumění 3D funkcím Windows Presentation Foundation (WPF). Návrhy v tomto dokumentu platí pro úroveň vykreslování 2, zhruba definováno jako hardware, který podporuje pixel shader verze 2.0 a vertex shader verze 2.0. Další podrobnosti najdete na úrovních vykreslování grafiky.
Dopad na výkon: Vysoká
Vlastnost | Doporučení |
---|---|
Brush | Rychlost štětce (nejrychlejší až nejpomalejší): SolidColorBrush LinearGradientBrush ImageBrush DrawingBrush (v mezipaměti) VisualBrush (v mezipaměti) RadialGradientBrush DrawingBrush (bez mezipaměti) VisualBrush (bez mezipaměti) |
ClipToBoundsProperty | Nastavte Viewport3D.ClipToBounds na false, kdykoli není nutné, aby Windows Presentation Foundation (WPF) explicitně vystřižoval obsah Viewport3D do obdélníku Viewport3D. Antialiasované ořezávání ve Windows Presentation Foundation (WPF) může být velmi pomalé a ClipToBounds je ve výchozím nastavení povoleno (pomalé) na Viewport3D. |
IsHitTestVisible | Nastavte Viewport3D.IsHitTestVisible na false, pokud nepotřebujete, aby Windows Presentation Foundation (WPF) brala v úvahu obsah Viewport3D při testování zasažení myší. Testování 3D obsahu se provádí v softwaru a může být pomalé s velkými sítěmi.
IsHitTestVisible je ve výchozím nastavení na Viewport3Dpovolené (pomalé). |
GeometryModel3D | Vytvářet různé modely pouze v případech, kdy vyžadují různé materiály nebo transformace. V opačném případě zkuste sloučit mnoho instancí GeometryModel3D se stejnými materiály a transformacemi do několika větších instancí GeometryModel3D a MeshGeometry3D. |
MeshGeometry3D | Animace síťové struktury – změna jednotlivých vrcholů sítě pro každý snímek – není ve Windows Presentation Foundation (WPF) vždy efektivní. Chcete-li minimalizovat dopad oznámení o výkonu při změně každého vrcholu, odpojte síť od vizuálního stromu před provedením úprav jednotlivých vrcholů. Po úpravě sítě ji znovu připojte k vizuálnímu stromu. Zkuste také minimalizovat velikost sítí, které budou tímto způsobem animované. |
3D antialiasing | Pokud chcete zvýšit rychlost vykreslování, zakažte vícevzorkování na Viewport3D nastavením připojené vlastnosti EdgeMode na Aliased . Ve výchozím nastavení je ve Windows povolené 3D antialiasing se 4 vzorky na pixel. |
Text | Živý text ve 3D scéně (je živý, protože se nachází v DrawingBrush nebo VisualBrush) může být pomalý. Pokud se text nezmění, zkuste místo toho použít obrázky textu (přes RenderTargetBitmap). |
TileBrush | Pokud musíte použít VisualBrush nebo DrawingBrush ve 3D scéně, protože obsah štětce není statický, zkuste štětec uložit do mezipaměti (nastavení připojené vlastnosti CachingHint na Cache ). Nastavte minimální a maximální prahové hodnoty zneplatnění škálování (s připojenými vlastnostmi CacheInvalidationThresholdMinimum a CacheInvalidationThresholdMaximum), aby se štětce uložené v mezipaměti negenerovaly příliš často a přitom zachovaly požadovanou úroveň kvality. Ve výchozím nastavení se DrawingBrush a VisualBrush neukládají do mezipaměti, což znamená, že pokaždé, když je něco kresleno štětcem znovu vykresleno, je nutné znovu vykreslit celý obsah štětce na přechodný povrch. |
BitmapEffect | BitmapEffect vynutí vykreslení veškerého ovlivněného obsahu bez hardwarové akcelerace. Pro zajištění nejlepšího výkonu nepoužívejte BitmapEffect. |
Dopad na výkon: Střední
Vlastnost | Doporučení |
---|---|
MeshGeometry3D | Pokud je síť definována jako přiléhací trojúhelníky se sdílenými vrcholy a tyto vrcholy mají stejnou pozici, normální a texturové souřadnice, definujte každý sdílený vrchol pouze jednou a pak definujte trojúhelníky pomocí indexu s TriangleIndices. |
ImageBrush | Zkuste minimalizovat velikosti textury, pokud máte explicitní kontrolu nad velikostí (pokud používáte RenderTargetBitmap nebo ImageBrush). Mějte na paměti, že textury s nižším rozlišením můžou snížit kvalitu vizuálu, takže zkuste najít správnou rovnováhu mezi kvalitou a výkonem. |
Neprůhlednost | Při vykreslování průsvitného 3D obsahu (například odrazů) použijte vlastnosti neprůhlednosti na štětcích nebo materiálech (prostřednictvím Opacity nebo Color) místo vytvoření samostatného průsvitného Viewport3D nastavením Viewport3D.Opacity na hodnotu menší než 1. |
Viewport3D | Minimalizujte počet Viewport3D objektů, které používáte ve scéně. Místo vytváření samostatných instancí Viewport3D pro každý model umístěte mnoho 3D modelů do stejného zobrazení. |
Freezable | Obvykle je užitečné opakovaně používat MeshGeometry3D, GeometryModel3D, štětce a materiály. Všechny jsou multiparentovatelné, protože jsou odvozeny z Freezable . |
Freezable | Zavolejte metodu Freeze pro Freezables, když jejich vlastnosti zůstanou nezměněny ve vaší aplikaci. Zmrazení může snížit pracovní sadu a zvýšit rychlost. |
Brush | Místo VisualBrush nebo DrawingBrush použijte ImageBrush, pokud se obsah štětce nezmění. 2D obsah lze převést na Image prostřednictvím RenderTargetBitmap a pak použít v ImageBrush. |
BackMaterial | Nepoužívejte BackMaterial, pokud nepotřebujete vidět zadní plochy GeometryModel3D. |
Light | Rychlost světla (nejrychlejší až nejpomalejší): AmbientLight DirectionalLight PointLight SpotLight |
MeshGeometry3D | Zkuste zachovat velikosti sítí v těchto mezích: Positions: 20 001 instancí Point3D TriangleIndices: 60 003 instancí Int32 |
Material | Rychlost materiálu (nejrychlejší až nejpomalejší): EmissiveMaterial DiffuseMaterial SpecularMaterial |
Brush | Windows Presentation Foundation (WPF) 3D nevyřazuje neviditelné výplně (černé ambiente výplně, průhledné výplně atd.) jednotným způsobem. Zvažte vynechání těchto věcí ze scény. |
MaterialGroup | Každý Material v MaterialGroup způsobí další průchod vykreslování, takže zahrnutí mnoha materiálů, dokonce i těch jednoduchých, může výrazně zvýšit nároky na výpočetní výkon na GPU. Minimalizujte počet materiálů v MaterialGroup. |
Dopad na výkon: Nízká
Vlastnost | Doporučení |
---|---|
Transform3DGroup | Pokud nepotřebujete animaci nebo datovou vazbu, místo použití skupiny transformací obsahující více transformací použijte jeden MatrixTransform3D, nastavte ho jako součin všech transformací, které by jinak existovaly nezávisle ve skupině transformací. |
Light | Minimalizujte počet světel ve vaší scéně. Příliš mnoho světel ve scéně způsobí, že Windows Presentation Foundation (WPF) se vrátí k vykreslování softwaru. Limity jsou přibližně 110 DirectionalLight objektů, 70 objektů PointLight nebo 40 objektů SpotLight. |
ModelVisual3D | Oddělte přesouvání objektů od statických objektů tak, že je umístíte do samostatných ModelVisual3D instancí. ModelVisual3D je "těžší" než GeometryModel3D, protože ukládá transformované hranice do mezipaměti. GeometryModel3D je optimalizovaný tak, aby byl model; ModelVisual3D je optimalizovaný tak, aby byl uzlem scény. Pomocí ModelVisual3D umístěte sdílené instance GeometryModel3D do scény. |
Light | Minimalizujte počet změn počtu světel ve scéně. Každá změna počtu světel vynutí regeneraci a rekompilaci shaderu, pokud již tato konfigurace neexistovala (a proto byl jeho shader uložen do mezipaměti). |
Světlo | Černá světla nebudou viditelná, ale prodlouží dobu vykreslování, zvažte jejich vynechání. |
MeshGeometry3D | Chcete-li minimalizovat dobu vytváření velkých kolekcí ve Windows Presentation Foundation (WPF), jako je MeshGeometry3D's Positions, Normals, TextureCoordinatesa TriangleIndices, předem nastavte velikost kolekcí před jejich naplněním hodnotami. Pokud je to možné, předávejte konstruktorům kolekcí předem vyplněné datové struktury, jako jsou pole nebo Seznamy. |
Viz také
- přehled 3D grafiky
.NET Desktop feedback