最佳化效能:2D 圖形和影像處理
WPF 提供各種不同的 2D 圖形和影像處理功能,可針對您的應用程式需求進行優化。 本主題提供下列領域的效能最佳化相關資訊。
繪圖和圖形
WPF 提供 Drawing 和 Shape 物件來表示圖形繪圖內容。 不過, Drawing 物件比 Shape 物件更簡單的建構,並提供更佳的效能特性。
Shape可讓您將圖形圖形繪製到畫面。 因為它們衍生自 FrameworkElement 類別, Shape 所以物件可以在面板和大部分控制項內使用。
WPF 提供數層的圖形和轉譯服務存取。 在最上層, Shape 物件很容易使用,並提供許多有用的功能,例如版面配置和事件處理。 WPF 提供一些現成可用的繪圖物件。 所有繪圖物件都會繼承自 Shape 類別。 可用的繪圖物件包括 Ellipse 、、 PathLine 、 Polygon 、 Polyline 、 和 Rectangle 。
Drawing 另一方面,物件不會衍生自 FrameworkElement 類別,並提供較輕量實作來轉譯圖形、影像和文字。
物件有四種類型 Drawing :
GeometryDrawing 繪製圖形。
ImageDrawing 繪製影像。
GlyphRunDrawing 繪製文字。
DrawingGroup 繪製其他繪圖。 您可以使用繪圖群組,將其他繪圖結合為單一複合繪圖。
物件 GeometryDrawing 是用來轉譯幾何內容。 衍生 Geometry 自它的類別和具體類別,例如 CombinedGeometry 、 EllipseGeometry 和 PathGeometry ,提供轉譯 2D 圖形和提供點擊測試和裁剪支援的方法。 舉例來說,Geometry 物件可用來定義控制項的區域,或定義要套用至影像的裁剪區域。 Geometry 物件可以是矩形和圓形之類的簡單區域,或從兩個或多個 Geometry 物件建立的複合區域。 結合衍生物件,例如 ArcSegment 、 BezierSegment 和 QuadraticBezierSegment ,即可建立 PathSegment 更複雜的幾何區域。
在介面上 Geometry ,類別和 Shape 類別很類似。 這兩者都用於 2D 圖形的轉譯中,而且都有衍生自它們的類似具體類別,例如 EllipseGeometry 和 Ellipse 。 不過,這兩組類別之間有非常重要的差異。 其中一個類別 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 ,例如 DrawingBrush 和 VisualBrush 。 在靜態案例中,場景中的內容或使用 TileBrush 不會變更,這很合理,因為它會節省視訊記憶體。 當具有靜態內容的 以非靜態方式使用 時 TileBrush ,它並無太大意義,例如,當靜態 DrawingBrush 或 VisualBrush 對應至旋轉 3D 物件的表面時。 WPF 的預設行為是重新轉譯 或 每個畫面的整個內容 DrawingBrushVisualBrush ,即使內容未變更也一樣。
藉由將 CachingHint 物件的 屬性 RenderOptions 設定為 Cache ,您可以使用快取版本的並排筆刷物件來提升效能。
CacheInvalidationThresholdMinimum和 CacheInvalidationThresholdMaximum 屬性值是相對大小值,可判斷 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)
另請參閱
意見反應
https://aka.ms/ContentUserFeedback。
即將登場:在 2024 年,我們將逐步淘汰 GitHub 問題作為內容的意見反應機制,並將它取代為新的意見反應系統。 如需詳細資訊,請參閱:提交並檢視相關的意見反應