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 reprezentujące zawartość rysunku graficznego. Drawing Obiekty są jednak prostsze niż Shape obiekty i zapewniają lepszą wydajność.

Obiekt umożliwia Shape rysowanie kształtu graficznego na ekranie. Ponieważ pochodzą one z FrameworkElement klasy, 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 Shape obiekty 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 obiektów kształtu. Wszystkie obiekty kształtu dziedziczą z Shape klasy. Dostępne obiekty kształtu obejmują Ellipse, , Line, PathPolygon, Polyline, i Rectangle.

Drawing obiekty, z drugiej strony, nie pochodzą z FrameworkElement klasy i zapewniają lżejszą implementację do renderowania kształtów, obrazów i tekstu.

Istnieją cztery typy Drawing obiektów:

Obiekt jest używany do renderowania GeometryDrawing zawartości geometrycznej. Klasa Geometry i konkretne klasy, które pochodzą z niego, takie jak CombinedGeometry, EllipseGeometryi PathGeometry, zapewniają metodę renderowania grafiki 2D i zapewnia obsługę testowania trafień i wycinków. Obiekty geometryczne mogą służyć do definiowania regionu kontrolki, na przykład lub definiowania regionu klipu w celu zastosowania 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 PathSegmentobiekty pochodne, takie jak ArcSegment, BezierSegmenti QuadraticBezierSegment.

Na powierzchni Geometry klasa i Shape klasa są podobne. Oba są używane w renderowaniu grafiki 2D, a oba mają podobne klasy betonowe, które pochodzą z nich, na przykład, EllipseGeometry i Ellipse. Istnieją jednak istotne różnice między tymi dwoma zestawami klas. Dla jednej Geometry z nich klasa nie ma niektórych funkcji Shape klasy, 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 ścieżka jest kształtem) należy użyć 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ż Shape obiekty pochodzą z FrameworkElement klasy, użycie ich może znacznie zwiększyć zużycie pamięci w aplikacji. Jeśli naprawdę nie potrzebujesz FrameworkElement funkcji zawartości graficznej, rozważ użycie obiektów o lżejszej wadze Drawing .

Aby uzyskać więcej informacji na Drawing temat obiektów, zobacz Omówienie obiektów rysunkowych.

Obiekty StreamGeometry

Obiekt StreamGeometry jest uproszczoną alternatywą dla PathGeometry tworzenia kształtów geometrycznych. Użyj elementu StreamGeometry , jeśli musisz opisać złożoną geometrię. StreamGeometry jest zoptymalizowany pod kątem obsługi wielu PathGeometry obiektów i działa lepiej w porównaniu z użyciem wielu pojedynczych PathGeometry obiektów.

W poniższym przykładzie użyto składni atrybutów do utworzenia trójkątnego StreamGeometry kodu 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 StreamGeometry temat obiektów, zobacz Create a Shape Using a StreamGeometry (Tworzenie kształtu przy użyciu strumieniaGeometry).

Obiekty rysunkoweVisual

Obiekt DrawingVisual jest lekką klasą rysunku używaną do renderowania kształtów, obrazów lub tekstu. Ta klasa jest uważana za uproszczoną, ponieważ nie zapewnia układu ani obsługi zdarzeń, co poprawia jego wydajność. Z tego powodu rysunki są idealne dla tła i klipartu. Aby uzyskać więcej informacji, zobacz Using DrawingVisual Objects (Używanie obiektów DrawingVisual).

Obrazy

Obrazowanie WPF zapewnia znaczną poprawę możliwości tworzenia obrazów w poprzednich wersjach systemu Windows. Możliwości tworzenia obrazów, takie jak wyświetlanie mapy bitowej lub używanie obrazu na wspólnej kontrolce, były obsługiwane głównie przez interfejs programowania aplikacji (API) lub interfejs programowania aplikacji (API) systemu Microsoft Windows. 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 Omówienie obrazowania.

BitmapScalingMode

Podczas animowania skali dowolnej mapy bitowej domyślny algorytm ponownego próbkowania obrazu wysokiej jakości może czasami zużywać wystarczające zasoby systemowe, aby spowodować obniżenie szybkości klatek, co skutecznie powoduje zacinanie animacji. Ustawiając BitmapScalingMode właściwość RenderOptions obiektu 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)

Buforowanie Hint

Domyślnie WPF nie buforuje renderowanej zawartości TileBrush obiektów, takich jak DrawingBrush i VisualBrush. W scenariuszach statycznych, w których zawartość lub użycie TileBrush obiektu w scenie nie ulegają zmianie, ma to sens, ponieważ oszczędza pamięć wideo. Nie ma sensu, gdy element TileBrush z zawartością statyczną jest używany w sposób niestatyczny — na przykład gdy statyczny DrawingBrush lub VisualBrush jest mapowany na powierzchnię obracającego się obiektu 3D. Domyślnym zachowaniem platformy WPF jest ponowne renderowanie całej zawartości DrawingBrush obiektu lub VisualBrush dla każdej ramki, mimo że zawartość jest niezmienna.

Ustawiając CachingHint właściwość RenderOptions obiektu Cachena , można zwiększyć wydajność przy użyciu buforowanych wersji obiektów pędzla kafelków.

Wartości CacheInvalidationThresholdMinimum właściwości i CacheInvalidationThresholdMaximum są względnymi wartościami rozmiaru, które określają, kiedy TileBrush obiekt powinien być ponownie wygenerowany z powodu zmian w skali. Na przykład przez ustawienie CacheInvalidationThresholdMaximum właściwości na 2.0 pamięć podręczna TileBrush tylko musi być ponownie wygenerowana, 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 wskazówek buforowania dla elementu 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ż