16

私は現在、キャンバス上にパス、楕円などの WPF 形状を描画する視覚化ツールを開発しています。可視性に応じてその場で形状が破棄および作成される仮想化アプローチを既に実装しています。ただし、楕円が 600 個しか表示されていない場合でも、アプリケーションは苦労しているようです。

物事をスピードアップするためのオプションは何ですか? グループ化されたシェイプ (一度に 500 としましょう) を透明なビットマップとしてレンダリングし、これらをキャンバスにのみペイントすることを考えています。しかし、それが良い考えかどうかはわかりません...私が収集したものから、変換が適用された場合、これにはある種のハックが必要です:

     VisualBrush shapeBrush = new VisualBrush(shape);  

     DrawingVisual drawingVisual = new DrawingVisual();  
     DrawingContext drawingContext = drawingVisual.RenderOpen();  

     using (drawingContext)  
     {  
        drawingContext.DrawRectangle(shapeBrush, null, new Rect(new Point(0, 0), new Point(actualWidth, actualHeight)));  
     }  
     renderTarget.Render(drawingVisual);  

大きな WritableBitmap を使用するのはどうですか? それは別のアプローチでしょうか?

4

3 に答える 3

7

カバーの下の WPF は、描画とジオメトリを操作します。形状を操作していると言うとき、これらは実際の UIElement ですか? そのような要素はかなり重いです。基本的な (できればストリーム) ジオメトリのみを使用して描画を行うと、私の経験では最高のパフォーマンスが得られます。

このアプローチでは、妥当なフレームレートで約 10000 ドットまで取得できましたが、ドットよりも複雑なものは速度が低下し始めます (たとえば、丸いドットや単なる長方形など)。それでも、WPF のオーバーヘッドをできるだけ回避したい場合は、基本的なジオメトリと基本的な描画を使用することをお勧めします。

書き込み可能なビットマップは最終的には明らかに高速ですが、それは、これらすべての形状を自分でレンダーするか、結果のビットマップがほとんど静的である場合はキャッシュすることを意味します。また、通常は、レンダリングされたビットマップ自体に変換を適用するのではなく、ビットマップにレンダリングする前に変換を適用する必要があります。

于 2009-09-29T08:00:12.440 に答える
4

私はこれが古い質問であることを知っています、私はただコミュニティの利益のために答えています。

私はこのトピックを少し調べましたが、私が見つけた最善の方法は、あなたが言うように手動でDrawingVisualsを作成することです。これにより、WPFの内部作業が大幅に節約されるため、最終的にははるかに高速になります。この手法を使用して、数百ポイントの軽量チャートを作成しました。これが私がインスピレーションを得た記事です、あなたはすでにそれについて知っているかもしれません。

http://blogs.microsoft.co.il/blogs/tamir/archive/2008/03/02/how-to-high-performance-graphics-in-wpf.aspx

編集:新しいURL http://khason.net/blog/how-to-high-performance-graphics-in-wpf/
編集:新しいURL:http ://dedjo.blogspot.com/2008/03/how-to -high-performance-graphics-in-wpf.html

幸運を。

于 2011-02-07T02:17:07.357 に答える
-2

強引な方法として、ActiveX コントロールを実装し、Win32 を使用してグラフィックを直接レンダリングすることがあります。ただし、これはやや面倒です。QT のキャンバス コントロールは、同じ目的を達成するためのより暖かくふわふわしたアプローチである可能性があり、このタイプのものをかなり迅速にレンダリングすることで知られています。Troll は、QT の商用バージョン用の ActiveX ラッパーを提供しているため、統合が容易になる可能性があります。

于 2009-09-29T08:11:43.153 に答える