2011-01-31 8 views
5

私は長いキャンバスに線を描いています(ストリップチャートを考えます)。低レベルのジオメトリクラスを使用してフリーズするなど、パフォーマンスがかなり良く調整されています。これによりパフォーマンスは飛躍的に向上しましたが、キャンバスに数千のアイテムをロードするのに数秒かかります。アプリケーションのパフォーマンス分析を行ったところ、canvas.children.add()を呼び出すたびに大きな割合を占めるように見えました。私はこれが軽量なコールでなければならないことを読んできました。そして、私はそれを何回も一つのメソッドで呼んでいるので、重いものをやろうとしてはいけません...これはおそらく他の理由があるかもしれません長時間?そして私はそれをスピードアップするかもしれませんか?WPFキャンバスのパフォーマンス - children.addが何度も呼び出される

パフォーマンスはひどいわけではありませんが、大きなデータセットに対処する必要がある場合は、後で問題になる可能性があります。

このサンプルでは1400回、現代/高速ラップトップではほぼ3秒のCPU時間がかかるようです。

しかし、キャンバスは他のコントロールのヒエラルキーに含まれています。そのため、キャンバスがこれに貢献しているかどうかは不思議です。

補足:グリッドの親コンテナを塗りつぶすように設定されているため、キャンバスに特定の高さを設定していません。これが問題の原因となりますか?

+2

http: ://msdn.microsoft.com/en-us/library/system.windows.media.streamgeometry.aspxストリームDrawing Contextよりも軽量の構造であるジオメトリ。 –

+0

うまく、すでにストリームのジオメトリを使用して、良い結果。ありがとう –

答えて

0

子供のように追加するのではなく、イメージに直接描画することをお勧めします。 子どもをレンダリングすると、巨大なオーバーヘッドが発生します(ご覧のとおり)。

How to draw line of ten thousands of points with WPF within 0.5 second?

+0

これを避けたいと思っていました。私は他のことが起こっているので、いつも再描画するのが難しくなります。ドラッグ可能なテキストボックスや画像が上に追加され、セクションは非常に長く、スクロール可能なコンテナ内に存在します。考慮すべき多くの変数... –

+3

パフォーマンスの重要性に応じて、C#の多くのゲームフレームワークの1つ(つまりスプライトを操作するもの)のソリューションを検討したいことがあります。もちろん、実際にあなたを助けない他のUI Frameworkのメカニズムを使用したい場合は BTW:特定の条件下では、WPFはパフォーマンスを大幅に低下させる可能性のあるハードウェアレンダリングを使用しません。 Debug.WriteLine( "WPF RenderCapabilities:Rendering Tier =" +(RenderCapability.Tier >> 16)+ "(望ましい2、0はハードウェアアクセラレーションを意味しない)"); ' – NightDweller

1

ちょうどキャンバス内でのコントロールの階層について追加すると、キャンバスの高さ:

いくつかの有用な記事を参照して、同様の質問がありますキャンバスは、与えられたものと同じくらい多くのスペースをとりますが、子どもが何を付け加えても、それは決して親に新しいMeasuer/Arrangeパスを引き起こしません。そのためにキャンバス内で何が行われても、それが含まれているビジュアルツリーには決して影響しません。 問題を解決することはできません。川流域に切り替えることで解決するだろう。

+0

私はすでに適用されている追加されたすべての子供のためにストリームギーメトリを使用しています。彼らは多くのパフォーマンスを助けてくれましたが、依然として大幅に改善を目指していました。 –

+1

は私から嘘つきにしました。ちょうどstreamgeoに変換され、間違いなく高速です。 –

+0

-1私は同じ問題を抱えていますが、Shapes型の子どもを扱っていますが、同じ動作が遅いのです – simo

4

主な問題は、StreamGeometryオブジェクトを使用する場合でも、Children.Addは常に遅い操作です。私は最近同じ問題に直面し、次のように結論づけました。 オブジェクトを新しいキャンバスに入れてメインキャンバスに入れ子にすると、加算操作のパフォーマンスが大幅に向上します。 1400要素を追加する代わりに、7つのキャンバスに200個の要素を入れ、それらの7つのキャンバスをメインキャンバスに追加します。 すべてのオブジェクトは現在異なるキャンバスに属しているため、アプリを少し調整する必要がありますが、DrawingVisualのような代替ソリューションに移行するよりもあまり劇的ではありません。

+0

Jaime、これから推測するとどれくらいのパーフォロマンスが得られますか?すなわち、10%または100%の速度ゲイン?ありがとう。 –

+0

私の具体的なケースでは(300以上のオブジェクトが5000回以上の子供コレクションに一度に追加されました)、私は2.5秒の遅延があり、0.3秒になりました。 –

+0

うわー、それは本当に良いです。再度、感謝します。 –

関連する問題