最佳化效能:2D 圖形和影像處理

WPF 提供各種不同的 2D 圖形和影像處理功能,可針對您的應用程式需求進行優化。 本主題提供下列領域的效能最佳化相關資訊。

繪圖和圖形

WPF 提供 DrawingShape 物件來表示圖形繪圖內容。 不過, Drawing 物件比 Shape 物件更簡單的建構,並提供更佳的效能特性。

Shape可讓您將圖形圖形繪製到畫面。 因為它們衍生自 FrameworkElement 類別, Shape 所以物件可以在面板和大部分控制項內使用。

WPF 提供數層的圖形和轉譯服務存取。 在最上層, Shape 物件很容易使用,並提供許多有用的功能,例如版面配置和事件處理。 WPF 提供一些現成可用的繪圖物件。 所有繪圖物件都會繼承自 Shape 類別。 可用的繪圖物件包括 Ellipse 、、 PathLinePolygonPolyline 、 和 Rectangle

Drawing 另一方面,物件不會衍生自 FrameworkElement 類別,並提供較輕量實作來轉譯圖形、影像和文字。

物件有四種類型 Drawing

物件 GeometryDrawing 是用來轉譯幾何內容。 衍生 Geometry 自它的類別和具體類別,例如 CombinedGeometryEllipseGeometryPathGeometry ,提供轉譯 2D 圖形和提供點擊測試和裁剪支援的方法。 舉例來說,Geometry 物件可用來定義控制項的區域,或定義要套用至影像的裁剪區域。 Geometry 物件可以是矩形和圓形之類的簡單區域,或從兩個或多個 Geometry 物件建立的複合區域。 結合衍生物件,例如 ArcSegmentBezierSegmentQuadraticBezierSegment ,即可建立 PathSegment 更複雜的幾何區域。

在介面上 Geometry ,類別和 Shape 類別很類似。 這兩者都用於 2D 圖形的轉譯中,而且都有衍生自它們的類似具體類別,例如 EllipseGeometryEllipse 。 不過,這兩組類別之間有非常重要的差異。 其中一個類別 Geometry 缺少 類別的 Shape 一些功能,例如繪製本身的能力。 若要繪製 Geometry 物件,必須使用 DrawingContext、Drawing 或 Path (注意,Path 也是一種 Shape) 等其他類別來執行繪製作業。 填滿、筆劃和筆劃粗細等轉譯屬性位於繪製幾何物件的類別上,而繪圖物件則包含這些屬性。 其中一種可思考此差異的方法是幾何物件定義區域,例如圓形,而繪圖物件定義區域、定義該區域的填滿方式和大綱,以及參與版面配置系統。

由於 Shape 物件衍生自 FrameworkElement 類別,因此使用這些物件可在應用程式中新增更多記憶體耗用量。 如果您真的不需要 FrameworkElement 圖形化內容的功能,請考慮使用較輕 Drawing 量的物件。

如需物件的詳細資訊 Drawing ,請參閱 繪圖物件概觀

StreamGeometry 物件

物件 StreamGeometry 是建立幾何圖形的 PathGeometry 輕量型替代方案。 StreamGeometry當您需要描述複雜幾何時,請使用 。 StreamGeometry相較于使用許多個別 PathGeometry 物件,已針對處理許多 PathGeometry 物件進行優化,且執行效能更好。

下列範例使用屬性語法在 XAML 中建立三角形 StreamGeometry

<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>

如需物件的詳細資訊 StreamGeometry ,請參閱 使用 StreamGeometry 建立圖形。

DrawingVisual 物件

物件 DrawingVisual 是輕量型繪圖類別,用來轉譯圖形、影像或文字。 此類別之所以被視為輕量型,是因為它不提供版面配置或事件處理,這使它有更好的效能。 基於此原因,繪圖適合背景或美工圖案。 如需詳細資訊,請參閱使用 DrawingVisual 物件

圖像

WPF 映射處理可大幅改善舊版 Windows 中的映射處理功能。 影像功能,例如在通用控制項上顯示點陣圖或使用影像,主要是由 Microsoft Windows 圖形裝置介面 (GDI) 或 Microsoft Windows GDI+ 應用程式開發介面 (API) 處理。 這些 API 提供基準映射功能,但缺少的功能,例如支援編解碼器擴充性和高逼真度影像支援。 WPF 映射 API 已經過重新設計,以克服 GDI 和 GDI+ 的缺點,並提供一組新的 API 來顯示及使用應用程式內的影像。

使用影像時,請考慮下列建議事項以取得較佳的效能:

  • 如果您的應用程式需要顯示縮圖影像,請考慮建立影像的縮小版本。 根據預設,WPF 會載入您的影像,並將它解碼為其完整大小。 如果您只想要影像的縮圖版本,WPF 就不需要將影像解碼為其完整大小,然後將它縮減為縮圖大小。 若要避免這種不必要的額外負荷,您可以要求 WPF 將影像解碼為縮圖大小,或要求 WPF 載入縮圖大小影像。

  • 一律將影像解碼至所需大小,而非預設大小。 如上所述,要求 WPF 將影像解碼為所需的大小,而不是預設的完整大小。 這麼做不只能減少應用程式的工作集,還會降低執行速度。

  • 因此,可能的話,請將影像合併單一影像,例如多張影像組成的底片。

  • 如需詳細資訊,請參閱 影像處理概觀

BitmapScalingMode

以動畫顯示任何點陣圖的縮放比例時,預設的高品質影像重新取樣演算法有時可能會耗用足夠的系統資源,以造成畫面播放速率降低,因而造成動畫停滯不前。 藉由將 BitmapScalingMode 物件的 屬性 RenderOptions 設定為 LowQuality ,您可以在調整點陣圖時建立更流暢的動畫。 LowQuality 模式會指示 WPF 轉譯引擎在處理影像時,從品質優化的演算法切換到速度優化的演算法。

下列範例示範如何設定 BitmapScalingMode 影像物件的 。

// 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)

CachingHint

根據預設,WPF 不會快取 物件的轉譯內容 TileBrush ,例如 DrawingBrushVisualBrush 。 在靜態案例中,場景中的內容或使用 TileBrush 不會變更,這很合理,因為它會節省視訊記憶體。 當具有靜態內容的 以非靜態方式使用 時 TileBrush ,它並無太大意義,例如,當靜態 DrawingBrushVisualBrush 對應至旋轉 3D 物件的表面時。 WPF 的預設行為是重新轉譯 或 每個畫面的整個內容 DrawingBrushVisualBrush ,即使內容未變更也一樣。

藉由將 CachingHint 物件的 屬性 RenderOptions 設定為 Cache ,您可以使用快取版本的並排筆刷物件來提升效能。

CacheInvalidationThresholdMinimumCacheInvalidationThresholdMaximum 屬性值是相對大小值,可判斷 TileBrush 何時應該因為縮放比例變更而重新產生物件。 例如,藉由將 CacheInvalidationThresholdMaximum 屬性設定為 2.0, TileBrush 只有當其大小超過目前快取的大小兩倍時,才需要重新產生快取的快取。

下列範例示範如何使用 的 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)

另請參閱