Udostępnij za pośrednictwem


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ż

  • Omówienie grafiki 3D