Maksymalizowanie wydajności WPF 3D
Podczas korzystania z programu Windows Presentation Foundation (WPF) do kompilowania kontrolek 3D i dołączania scen 3D w aplikacjach należy wziąć pod uwagę optymalizację wydajności. Ten temat zawiera listę klas i właściwości 3D, które mają wpływ na wydajność aplikacji, wraz z zaleceniami dotyczącymi optymalizacji wydajności podczas ich używania.
W tym temacie założono zaawansowaną wiedzę na temat funkcji 3D programu Windows Presentation Foundation (WPF). Sugestie w tym dokumencie dotyczą "warstwy 2 renderowania" — w przybliżeniu zdefiniowanej jako sprzęt obsługujący cieniowanie pikseli w wersji 2.0 i cieniowania wierzchołków w wersji 2.0. Aby uzyskać więcej informacji, zobacz Poziomy renderowania grafiki.
Wpływ na wydajność: wysoki
Własność | Zalecenie |
---|---|
Brush | Prędkość szczotki (najszybsza do najwolniejszego): SolidColorBrush LinearGradientBrush ImageBrush DrawingBrush (buforowane) VisualBrush (buforowane) RadialGradientBrush DrawingBrush (niezbuforowany) VisualBrush (bez pamięci podręcznej) |
ClipToBoundsProperty | Ustaw Viewport3D.ClipToBounds na false, kiedy nie potrzebujesz, aby Windows Presentation Foundation (WPF) jawnie przycinał zawartość Viewport3D do prostokąta Viewport3D. Antyaliasowane wycinki programu Windows Presentation Foundation (WPF) mogą być bardzo powolne, a ClipToBounds jest domyślnie włączona (powolna) na Viewport3D. |
IsHitTestVisible | Ustaw wartość Viewport3D.IsHitTestVisible na false za każdym razem, gdy nie potrzebujesz, aby Windows Presentation Foundation (WPF) brał pod uwagę zawartość Viewport3D podczas przeprowadzania testowania trafień myszy. Testowanie zawartości 3D odbywa się w oprogramowaniu i może być powolne przy użyciu dużych siatek.
IsHitTestVisible jest domyślnie włączona (powolna) w Viewport3D. |
GeometryModel3D | Twórz różne modele tylko wtedy, gdy wymagają różnych materiałów lub przekształceń. W przeciwnym razie spróbuj połączyć wiele wystąpień GeometryModel3D z takim samym materiałem i przekształcić je w kilka większych wystąpień GeometryModel3D i MeshGeometry3D. |
MeshGeometry3D | Animacja siatki – zmiana poszczególnych wierzchołków siatki na klatkę – nie zawsze jest wydajna w Windows Presentation Foundation (WPF). Aby zminimalizować wpływ powiadomień o zmianach na wydajność podczas modyfikacji każdego wierzchołka, odłącz siatkę od drzewa wizualnego przed dokonaniem modyfikacji wierzchołków. Po zmodyfikowaniu siatki ponownie dołącz ją do drzewa wizualnego. Ponadto spróbuj zminimalizować rozmiar siatek, które będą animowane w ten sposób. |
Antyaliasing 3D | Aby zwiększyć szybkość renderowania, wyłącz wielokrotne próbkowanie na Viewport3D poprzez ustawienie załączonej właściwości EdgeMode na Aliased . Domyślnie antyaliasing 3D jest włączony w systemie Windows z 4 próbkami na piksel. |
Tekst | Tekst w czasie rzeczywistym w scenie 3D (ponieważ znajduje się w DrawingBrush lub VisualBrush) może być powolny. Spróbuj użyć zamiast tego obrazów tekstu (za pośrednictwem RenderTargetBitmap), chyba że tekst zmieni się. |
TileBrush | Jeśli musisz użyć VisualBrush lub DrawingBrush w scenie 3D, ponieważ zawartość pędzla nie jest statyczna, spróbuj buforować pędzel (ustawiając właściwość dołączoną CachingHint na Cache ). Ustaw minimalne i maksymalne progi unieważniania skali (z dołączonymi właściwościami CacheInvalidationThresholdMinimum i CacheInvalidationThresholdMaximum), aby buforowane szczotki nie będą zbyt często generowane ponownie, zachowując jednocześnie żądany poziom jakości. Domyślnie DrawingBrush i VisualBrush nie są buforowane, co oznacza, że za każdym razem, gdy coś malowanego pędzlem musi zostać ponownie renderowane, cała zawartość pędzla musi zostać ponownie renderowana na powierzchnię pośrednią. |
BitmapEffect | BitmapEffect wymusza renderowanie całej zawartości, której dotyczy problem bez przyspieszania sprzętowego. Aby uzyskać najlepszą wydajność, nie używaj BitmapEffect. |
Wpływ na wydajność: średni
Własność | Zalecenie |
---|---|
MeshGeometry3D | Gdy siatka jest zdefiniowana jako przylegające trójkąty z udostępnionymi wierzchołkami, a te wierzchołki mają tę samą pozycję, wektory normalne i współrzędne tekstury, zdefiniuj każdy wspólny wierzchołek tylko raz, a następnie zdefiniuj trójkąty według indeksu za pomocą TriangleIndices. |
ImageBrush | Spróbuj zminimalizować rozmiary tekstur, gdy masz jawną kontrolę nad rozmiarem (jeśli używasz RenderTargetBitmap i/lub ImageBrush). Należy pamiętać, że tekstury niższej rozdzielczości mogą zmniejszyć jakość wizualizacji, więc spróbuj znaleźć właściwą równowagę między jakością a wydajnością. |
Nieprzezroczystość | Podczas renderowania przezroczystej zawartości 3D (takiej jak odbicia) użyj właściwości nieprzezroczystości pędzli lub materiałów (za pośrednictwem Opacity lub Color) zamiast tworzyć oddzielne przezroczyste Viewport3D, ustawiając Viewport3D.Opacity na wartość mniejszą niż 1. |
Viewport3D | Zminimalizuj liczbę obiektów Viewport3D używanych w scenie. Umieść wiele modeli 3D w tym samym Viewport3D zamiast tworzyć oddzielne wystąpienia Viewport3D dla każdego modelu. |
Freezable | Zazwyczaj korzystne jest ponowne użycie MeshGeometry3D, GeometryModel3D, pędzli i materiałów. Wszystkie są wielorodzicielskie, ponieważ pochodzą z Freezable . |
Freezable | Wywołaj metodę Freeze na obiekcie Freezables, gdy jego właściwości pozostaną niezmienione w Twojej aplikacji. Zamrażanie może zmniejszyć zestaw roboczy i zwiększyć prędkość. |
Brush | Użyj ImageBrush zamiast VisualBrush lub DrawingBrush, gdy zawartość pędzla nie ulegnie zmianie. Zawartość 2D można przekonwertować na Image za pośrednictwem RenderTargetBitmap, a następnie użyć w ImageBrush. |
BackMaterial | Nie używaj BackMaterial, chyba że rzeczywiście musisz zobaczyć tylne strony GeometryModel3D. |
Light | Prędkość światła (najszybsza do najwolniejszego): AmbientLight DirectionalLight PointLight SpotLight |
MeshGeometry3D | Staraj się zachować rozmiary siatki poniżej następujących limitów: Positions: 20 001 wystąpień Point3D TriangleIndices: 60 003 Int32 wystąpień |
Material | Szybkość materiału (najszybsza do najwolniejszego): EmissiveMaterial DiffuseMaterial SpecularMaterial |
Brush | Windows Presentation Foundation (WPF) 3D nie pomija niewidocznych pędzli (czarnych pędzli ambientowych, przezroczystych pędzli itp.) w spójny sposób. Rozważ pominięcie ich ze sceny. |
MaterialGroup | Każda Material w MaterialGroup powoduje kolejne przejście renderowania, więc dodanie wielu materiałów, nawet prostych, może znacznie zwiększyć obciążenie przetwarzania GPU. Zminimalizuj liczbę materiałów w MaterialGroup. |
Wpływ na wydajność: niski
Własność | Zalecenie |
---|---|
Transform3DGroup | Jeśli nie potrzebujesz animacji ani powiązania danych, zamiast używać grupy przekształcania zawierającej wiele przekształceń, użyj pojedynczej MatrixTransform3D, ustawiając ją jako produkt wszystkich przekształceń, które w przeciwnym razie istniałyby niezależnie w grupie przekształcania. |
Light | Zminimalizuj liczbę świateł w scenie. Zbyt wiele świateł w scenie zmusi Windows Presentation Foundation (WPF) do powrotu do renderowania oprogramowania. Limity to około 110 obiektów DirectionalLight, 70 obiektów PointLight lub 40 obiektów SpotLight. |
ModelVisual3D | Oddziel obiekty ruchome od obiektów statycznych, umieszczając je w osobnych wystąpieniach ModelVisual3D. ModelVisual3D jest "cięższy" niż GeometryModel3D, ponieważ buforuje przekształcone granice. GeometryModel3D jest zoptymalizowany, aby być modelem; ModelVisual3D jest zoptymalizowany, aby być węzłem sceny. Użyj ModelVisual3D, aby umieścić udostępnione wystąpienia GeometryModel3D w scenie. |
Light | Zminimalizuj liczbę zmian światła w scenie. Każda zmiana liczby światła wymusza regenerację cieniowania i ponowne kompilowanie, chyba że taka konfiguracja istniała wcześniej (i w związku z tym miała buforowane cieniowanie). |
Światło | Czarne światła nie będą widoczne, ale zostaną dodane do czasu renderowania; rozważ ich pominięcie. |
MeshGeometry3D | Aby zminimalizować czas budowy dużych kolekcji w Windows Presentation Foundation (WPF), takich jak Positions, Normals, TextureCoordinatesoraz TriangleIndicesw obiekcie MeshGeometry3D, należy uprzednio określić ich rozmiar przed zapełnieniem wartościami. Jeśli to możliwe, przekaż do konstruktorów kolekcji struktury danych, takie jak wstępnie wypełnione tablice lub listy. |
Zobacz też
.NET Desktop feedback