WPF には、アプリケーションの要件に合わせて最適化できるさまざまな 2D グラフィックスとイメージング機能が用意されています。 このトピックでは、これらの領域でのパフォーマンスの最適化に関する情報を提供します。
描画と図形
WPF には、グラフィカル描画コンテンツを表す Drawing オブジェクトと Shape オブジェクトの両方が用意されています。 ただし、 Drawing オブジェクトは、 Shape オブジェクトよりも単純なコンストラクトであり、パフォーマンス特性が向上します。
Shapeを使用すると、グラフィカルな図形を画面に描画できます。 FrameworkElement クラスから派生しているため、Shape オブジェクトはパネルとほとんどのコントロール内で使用できます。
WPF には、グラフィックス サービスとレンダリング サービスへのアクセスレイヤーがいくつか用意されています。 最上位レイヤーでは、 Shape オブジェクトは使いやすく、レイアウトやイベント処理など、多くの便利な機能を提供します。 WPF には、すぐに使用できる図形オブジェクトが多数用意されています。 すべての図形オブジェクトは、 Shape クラスから継承されます。 使用できる図形オブジェクトには、 Ellipse、 Line、 Path、 Polygon、 Polyline、および Rectangleがあります。
Drawing 一方、オブジェクトは FrameworkElement クラスから派生せず、図形、画像、テキストをレンダリングするための軽量な実装を提供します。
Drawing オブジェクトには、次の 4 種類があります。
GeometryDrawing 図形を描画します。
ImageDrawing イメージを描画します。
GlyphRunDrawing テキストを描画します。
DrawingGroup 他の図を描きます。 図面グループを使用して、他の図面を 1 つの複合図面に結合します。
GeometryDrawing オブジェクトは、ジオメトリ コンテンツをレンダリングするために使用されます。 Geometry クラスとその派生クラス (CombinedGeometry、EllipseGeometry、PathGeometryなど) は、2D グラフィックスをレンダリングし、ヒット テストとクリッピングのサポートを提供する手段を提供します。 ジオメトリ オブジェクトは、たとえば、コントロールの領域を定義したり、画像に適用するクリップ領域を定義したりするために使用できます。 ジオメトリ オブジェクトには、四角形や円などの単純な領域や、2 つ以上のジオメトリ オブジェクトから作成された複合領域を指定できます。 PathSegment、ArcSegment、BezierSegmentなどのQuadraticBezierSegment派生オブジェクトを組み合わせることで、より複雑なジオメトリ領域を作成できます。
表面上、 Geometry クラスと Shape クラスは似ています。 どちらも 2D グラフィックスのレンダリングで使用され、どちらも、 EllipseGeometry や Ellipseなど、それらから派生する同様の具象クラスを持ちます。 ただし、これら 2 つのクラス セットには重要な違いがあります。 1 つの場合、 Geometry クラスには、それ自体を描画する機能など、 Shape クラスの機能の一部がありません。 ジオメトリ オブジェクトを描画するには、DrawingContext、Drawing、Path などの別のクラスを使用して描画操作を実行する必要があります (Path は Shape である点に注意してください)。 塗りつぶし、ストローク、ストロークの太さなどのレンダリング プロパティは、ジオメトリ オブジェクトを描画するクラス上にあり、図形オブジェクトにはこれらのプロパティが含まれています。 この違いを考える 1 つの方法は、ジオメトリ オブジェクトが領域 (円など) を定義し、図形オブジェクトが領域を定義し、その領域の塗りつぶしとアウトライン化の方法を定義し、レイアウト システムに参加することです。
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 オブジェクトの使用を参照してください。
画像
WPF イメージングは、以前のバージョンの Windows のイメージング機能を大幅に改善します。 ビットマップの表示や共通コントロールでのイメージの使用などのイメージング機能は、主に Microsoft Windows グラフィックス デバイス インターフェイス (GDI) または Microsoft Windows GDI+ アプリケーション プログラミング インターフェイス (API) によって処理されました。 これらの API はベースライン イメージング機能を提供しましたが、コーデックの拡張性のサポートや高忠実度の画像のサポートなどの機能が不足しています。 WPF イメージング API は、GDI と GDI+ の欠点を克服し、アプリケーション内でイメージを表示および使用するための新しい API セットを提供するように再設計されました。
イメージを使用する場合は、パフォーマンスを向上させるために次の推奨事項を検討してください。
アプリケーションでサムネイル画像を表示する必要がある場合は、縮小サイズのイメージを作成することを検討してください。 既定では、WPF はイメージを読み込み、そのフル サイズにデコードします。 画像のサムネイル バージョンのみが必要な場合でも、WPF は不必要にイメージをフルサイズにデコードしてから、サムネイルサイズに縮小します。 この不要なオーバーヘッドを回避するには、WPF に画像をサムネイル サイズにデコードするように要求するか、WPF にサムネイル サイズイメージを読み込むように要求します。
イメージは常に、既定のサイズではなく目的のサイズにデコードします。 前述のように、既定のフル サイズではなく、目的のサイズにイメージをデコードするように WPF に要求します。 アプリケーションのワーキング セットだけでなく、実行速度も低下します。
可能であれば、複数の画像で構成されるフィルム ストリップなどの 1 つの画像に画像を結合します。
詳細については、「イメージングの概要」を参照してください。
ビットマップスケーリングモード
ビットマップのスケールをアニメーション化する場合、既定の高品質のイメージ リサンプリング アルゴリズムでは、フレーム レートの低下を引き起こすのに十分なシステム リソースが消費され、アニメーションが効果的に途切れる場合があります。 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 の既定の動作では、コンテンツが変更されていない場合でも、すべてのフレームに対して DrawingBrush または VisualBrush のコンテンツ全体を再レンダリングします。
CachingHint オブジェクトのRenderOptions プロパティをCacheに設定すると、キャッシュされたバージョンのタイル ブラシ オブジェクトを使用してパフォーマンスを向上させることができます。
CacheInvalidationThresholdMinimumプロパティ値とCacheInvalidationThresholdMaximumプロパティ値は、スケールの変更によってTileBrush オブジェクトをいつ再生成するかを決定する相対サイズ値です。 たとえば、 CacheInvalidationThresholdMaximum プロパティを 2.0 に設定すると、 TileBrush のキャッシュは、そのサイズが現在のキャッシュのサイズの 2 倍を超えた場合にのみ再生成する必要があります。
次の例は、 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)
こちらも参照ください
.NET Desktop feedback