Optymalizacja wydajności: grafika 2D i obrazowanie
WPF oferuje szeroką gamę funkcji graficznych i obrazowych 2D, które można zoptymalizować pod kątem wymagań aplikacji. Ten temat zawiera informacje o optymalizacji wydajności w tych obszarach.
Rysowanie i kształty
Platforma WPF udostępnia obiekty Drawing i Shape do reprezentowania zawartości rysunku graficznego. Jednak obiekty Drawing są prostsze niż obiekty Shape i zapewniają lepszą wydajność.
Shape umożliwia rysowanie kształtu graficznego na ekranie. Ponieważ pochodzą one z klasy FrameworkElement, Shape obiekty mogą być używane wewnątrz paneli i większości kontrolek.
WPF oferuje kilka warstw dostępu do usług grafiki i renderowania. W górnej warstwie obiekty Shape są łatwe w użyciu i zapewniają wiele przydatnych funkcji, takich jak układ i obsługa zdarzeń. WPF udostępnia wiele gotowych do użycia kształtów. Wszystkie obiekty kształtu dziedziczą z klasy Shape. Dostępne obiekty kształtu obejmują Ellipse, Line, Path, Polygon, Polylinei Rectangle.
Drawing obiekty, z drugiej strony, nie pochodzą z klasy FrameworkElement i zapewniają lżejszą implementację do renderowania kształtów, obrazów i tekstu.
Istnieją cztery typy obiektów Drawing:
GeometryDrawing Rysuje kształt.
ImageDrawing Rysuje obraz.
GlyphRunDrawing Rysuje tekst.
DrawingGroup Rysuje inne rysunki. Użyj grupy rysunków, aby połączyć inne rysunki w jeden rysunek złożony.
Obiekt GeometryDrawing służy do renderowania zawartości geometrycznej. Klasa Geometry i konkretne klasy, które z niej dziedziczą, takie jak CombinedGeometry, EllipseGeometryi PathGeometry, oferują możliwość renderowania grafiki 2D oraz obsługę testowania trafień i przycinania. Obiekty geometryczne mogą służyć np. do definiowania regionu kontrolki lub do definiowania regionu klipu, który zastosujemy do obrazu. Obiekty geometryczne mogą być prostymi regionami, takimi jak prostokąty i okręgi, lub regiony złożone utworzone na podstawie co najmniej dwóch obiektów geometrycznych. Bardziej złożone regiony geometryczne można utworzyć, łącząc obiekty pochodne PathSegment, takie jak ArcSegment, BezierSegmenti QuadraticBezierSegment.
Na powierzchni klasa Geometry i klasa Shape są podobne. Oba są używane w renderowaniu grafiki 2D i mają podobne konkretne klasy, które się od nich wywodzą, na przykład EllipseGeometry i Ellipse. Istnieją jednak istotne różnice między tymi dwoma zestawami klas. Dla jednej z nich klasa Geometry nie ma niektórych funkcji klasy Shape, takich jak możliwość rysowania się. Aby narysować obiekt geometryczny, należy użyć innej klasy, takiej jak DrawingContext, Drawing lub Path (warto zauważyć, że Path jest kształtem) do wykonania operacji rysunku. Właściwości renderowania, takie jak wypełnienie, pociągnięcie i grubość pociągnięcia, znajdują się w klasie, która rysuje obiekt geometryczny, a obiekt kształtu zawiera te właściwości. Jednym ze sposobów myślenia o tej różnicy jest to, że obiekt geometryczny definiuje region, na przykład okrąg, podczas gdy obiekt kształtu definiuje region, definiuje sposób wypełniania i konturowania tego regionu oraz uczestniczy w systemie układu.
Ponieważ obiekty Shape pochodzą z klasy FrameworkElement, użycie ich może znacznie zwiększyć zużycie pamięci w aplikacji. Jeśli naprawdę nie potrzebujesz funkcji FrameworkElement w swojej grafice, rozważ użycie obiektów Drawing o mniejszej złożoności.
Aby uzyskać więcej informacji na temat obiektów Drawing, zobacz Obiekty rysunkowe — omówienie.
Obiekty StreamGeometry
Obiekt StreamGeometry to lekka alternatywa dla PathGeometry do tworzenia kształtów geometrycznych. Użyj StreamGeometry, gdy musisz opisać złożoną geometrię. StreamGeometry jest zoptymalizowany pod kątem obsługi wielu obiektów PathGeometry i działa lepiej w porównaniu z użyciem wielu pojedynczych obiektów PathGeometry.
W poniższym przykładzie użyto składni atrybutów do utworzenia trójkątnego StreamGeometry w języku XAML.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<StackPanel>
<Path Data="F0 M10,100 L100,100 100,50Z"
StrokeThickness="1" Stroke="Black"/>
</StackPanel>
</Page>
Aby uzyskać więcej informacji na temat obiektów StreamGeometry, zobacz Tworzenie kształtu za pomocą StreamGeometry.
Obiekty rysunkoweVisual
Obiekt DrawingVisual to uproszczona klasa rysunku używana do renderowania kształtów, obrazów lub tekstu. Ta klasa jest uważana za lekką, ponieważ nie zapewnia ani rozmieszczenia, ani obsługi zdarzeń, co zwiększa jej wydajność. Z tego powodu rysunki są idealne dla tła i klipartu. Aby uzyskać więcej informacji, zobacz Korzystanie z obiektów DrawingVisual.
Obrazy
Obrazowanie WPF zapewnia znaczną poprawę możliwości tworzenia obrazów w poprzednich wersjach systemu Windows. Funkcje obrazowania, takie jak wyświetlanie mapy bitowej lub używanie obrazu na wspólnym elemencie kontrolnym, były głównie obsługiwane przez interfejs Microsoft Windows Graphics Device Interface (GDI) lub interfejs programowania aplikacji Microsoft Windows GDI+. Te interfejsy API udostępniały funkcje tworzenia obrazów bazowych, ale brakowało takich funkcji, jak obsługa rozszerzalności kodera i obsługa obrazów o wysokiej wierności. Interfejsy API obrazów WPF zostały przeprojektowane w celu przezwyciężenia niedociągnięć interfejsów GDI i GDI+ oraz udostępnienia nowego zestawu interfejsów API do wyświetlania i używania obrazów w aplikacjach.
Podczas korzystania z obrazów należy wziąć pod uwagę następujące zalecenia dotyczące uzyskiwania lepszej wydajności:
Jeśli aplikacja wymaga wyświetlania obrazów miniatur, rozważ utworzenie mniejszej wersji obrazu. Domyślnie WPF ładuje obraz i dekoduje go do pełnego rozmiaru. Jeśli chcesz tylko wersję miniatury obrazu, WPF niepotrzebnie dekoduje obraz do pełnego rozmiaru, a następnie skaluje go w dół do rozmiaru miniatury. Aby uniknąć tego niepotrzebnego obciążenia, możesz poprosić WPF o dekodowanie obrazu do rozmiaru miniatury lub poprosić WPF o załadowanie obrazu o rozmiarze miniatury.
Zawsze dekoduj obraz do żądanego rozmiaru, a nie do rozmiaru domyślnego. Jak wspomniano powyżej, poproś WPF o dekodowanie obrazu do żądanego rozmiaru, a nie domyślnego pełnego rozmiaru. Zmniejszysz nie tylko zestaw roboczy aplikacji, ale także szybkość wykonywania.
Jeśli to możliwe, połącz obrazy w jeden obraz, taki jak pasek filmowy składający się z wielu obrazów.
Aby uzyskać więcej informacji, zobacz Imaging Overview.
Tryb Skalowania Bitmapy
Podczas animowania skali dowolnej mapy bitowej, domyślny algorytm ponownego próbkowania obrazu w wysokiej jakości może czasami intensywnie wykorzystywać zasoby systemowe, co prowadzi do obniżenia liczby klatek na sekundę i powoduje zacinanie animacji. Ustawiając właściwość BitmapScalingMode obiektu RenderOptions na LowQuality, można utworzyć wygładszą animację podczas skalowania mapy bitowej. LowQuality tryb informuje aparat renderowania WPF o przełączeniu się z algorytmu zoptymalizowanego pod kątem jakości do algorytmu zoptymalizowanego pod kątem szybkości podczas przetwarzania obrazów.
W poniższym przykładzie pokazano, jak ustawić BitmapScalingMode dla obiektu obrazu.
// Set the bitmap scaling mode for the image to render faster.
RenderOptions.SetBitmapScalingMode(MyImage, BitmapScalingMode.LowQuality);
' Set the bitmap scaling mode for the image to render faster.
RenderOptions.SetBitmapScalingMode(MyImage, BitmapScalingMode.LowQuality)
BuforowanieHint
Domyślnie WPF nie buforuje renderowanej zawartości obiektów TileBrush, takich jak DrawingBrush i VisualBrush. W scenariuszach statycznych, w których zawartość lub użycie TileBrush w scenie nie ulegają zmianie, ma to sens, ponieważ oszczędza pamięć wideo. Nie ma sensu, gdy TileBrush z zawartością statyczną jest używana w sposób niestatyczny — na przykład gdy statyczna DrawingBrush lub VisualBrush jest mapowana na powierzchnię obracającego się obiektu 3D. Domyślnym zachowaniem platformy WPF jest ponowne renderowanie całej zawartości DrawingBrush lub VisualBrush dla każdej ramki, mimo że zawartość jest niezmienna.
Ustawiając właściwość CachingHint obiektu RenderOptions na Cache, można zwiększyć wydajność poprzez użycie buforowanych wersji obiektów pędzli kafelkowych.
Wartości właściwości CacheInvalidationThresholdMinimum i CacheInvalidationThresholdMaximum są względnymi wartościami rozmiaru, które określają, kiedy obiekt TileBrush powinien zostać wygenerowany ponownie z powodu zmian skali. Na przykład przez ustawienie właściwości CacheInvalidationThresholdMaximum na 2.0 pamięć podręczna dla TileBrush musi być ponownie wygenerowana tylko wtedy, gdy jego rozmiar przekracza dwa razy większy rozmiar bieżącej pamięci podręcznej.
W poniższym przykładzie pokazano, jak użyć opcji podpowiedzi dotyczących buforowania dla DrawingBrush.
DrawingBrush drawingBrush = new DrawingBrush();
// Set the caching hint option for the brush.
RenderOptions.SetCachingHint(drawingBrush, CachingHint.Cache);
// Set the minimum and maximum relative sizes for regenerating the tiled brush.
// The tiled brush will be regenerated and re-cached when its size is
// 0.5x or 2x of the current cached size.
RenderOptions.SetCacheInvalidationThresholdMinimum(drawingBrush, 0.5);
RenderOptions.SetCacheInvalidationThresholdMaximum(drawingBrush, 2.0);
Dim drawingBrush As New DrawingBrush()
' Set the caching hint option for the brush.
RenderOptions.SetCachingHint(drawingBrush, CachingHint.Cache)
' Set the minimum and maximum relative sizes for regenerating the tiled brush.
' The tiled brush will be regenerated and re-cached when its size is
' 0.5x or 2x of the current cached size.
RenderOptions.SetCacheInvalidationThresholdMinimum(drawingBrush, 0.5)
RenderOptions.SetCacheInvalidationThresholdMaximum(drawingBrush, 2.0)
Zobacz też
.NET Desktop feedback