Sdílet prostřednictvím


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é