2012-02-13 26 views
2

私は、スクロール可能な多くのオブジェクトを持つ大きなキャンバスを持っています。 私はクリックしてドラッグすることができるオブジェクトを画面に置いています(たとえば、テキストボックス)。オブジェクトはマウスをキャプチャするだけで、Canvas.SetLeft()とSetTop()をOnMouseMovedイベントとして呼び出すことが呼び出されます。多くのオブジェクトを持つ大きなキャンバスでパフォーマンスを引き出す

これは小さなキャンバスでうまくいきますが、数千のオブジェクトを持つこの非常に大きなオブジェクトは、ドラッグされたオブジェクトを非常にゆっくりとリフレッシュします。あまりユーザーフレンドリーではありません。

私はこの購入を改善する必要がありますどのように進歩するか分からない。

私が持っていた考えの1つは、現在のウィンドウサイズのみで子どもを含んでいない透明なキャンバスを前景にしておきます。ドラッグを開始するときは、完了するまでこのレイヤーに移動し、大きなレイヤーに戻します。しかし、もう1つのハックのための努力がたくさんあります...

更新:パーフォレータを使用して、私はこのオブジェクトをドラッグしている間、キャンバスが繰り返し実行されるレイアウトパスを取得しているのを見て、これは遅い部分です。これを回避する方法があるかどうかが分かります...

+0

何らかの仮想化が役立つでしょう。しかし、http://blogs.msdn.com/b/kaelr/archive/2010/08/11/zoomableapplication2-a-million-items.aspxは、可動アイテムには直接適用されないかもしれません。 –

+0

@ H.B .:移動されたアイテムが(仮想化に関係なく)常に描画されている限り、問題なく適用されます。遅いリフレッシュはおそらく、キャンバスが見えるものの代わりにその子供の* all *を繰り返しレイアウトすることです。後者のみを行う場合は、大きなパーフォーマンスが必要です。 –

+0

私は確かにキャンバスにこのようなもののためのビルトイン(オプション?)バーチャライザーを持っていて欲しいと思います...過去に仮想化されたキャンバスを使用しようとするとヒットしましたが、もう一度試してみてください。アー。 –

答えて

0

パフォーマンスの最適化は「ハッキング」ではありません。大規模な最適化では、パフォーマンスを管理し、それに労力がかかるように、多くのことを分ける必要があります。

あなたの提案は妥当だと思いますが、アイテムを「ドロップ」してキャンバスをリフレッシュすると、あなたが得ているラグはまだ起こりそうです。もう1つのアプローチは、現在スクリーン上に表示されているものだけを描画する「仮想化」キャンバスを作成することです。これは私がここでサンプルを提供しようとはしませんが、複雑な作業ですが、おそらくアプリケーション全体の描画パフォーマンスに役立つものです。

+0

私は仮想化のルートをダウンしていましたが、いくつかの差異が発生しました。その代わりに、ほとんどのキャンバスに非常に軽量のアイテムを使用することに焦点を当てました..ローディングパフォーマンスは良好で、スクロールは高速です。だから今、それはひどく遅れているように見えるこれらのドラッグ項目だけです。アー。 –

関連する問題