2009-03-16 12 views
2

私はこのWPF-VS2008 ScreenSaver templateをとり、新しいスクリーンセーバーを作り始めました。私はwinForms-platform(GDI +)スクリーンセーバーに関するいくつかの経験を持っているので、WPFで少し失われています。WPF - スクリーンセーバーのグラフィックパフォーマンスの向上

  1. 私のスクリーンセーバーの背景要素はCanvasです。
  2. DispatcherTimerティックは、30ミリ秒〜33ミリ秒に設定されています。
  3. 背景色は巨大なLinearGradientBrushの1つです。
  4. ランダムに計算された(初期化された)背景色+アルファチャンネルで描画されたn楕円形(使用可能な画面ごとに、私のローカルコンピュータには2つあります)があります。彼らはすべてCanvas's Childrenコレクションに入っています。
  5. 私はいくつかのロジック(すべてのDispatcherTimerティック)で画面の周りに楕円を動かしています。楕円ごとに移動し、各楕円についてCanvas.SetLeft(...)とCanvas.SetTop(...)を呼び出します。
  6. N(楕円の数)が> 70-80より大きい場合、グラフィックのスローダウンに気付き始めます。

ここで、より高いN値を選択するときにグラフィックの滑らかさを改善するためにできることがあれば、私は疑問に思いますか?私の楕円を動かす前に「何か」を「動かす」ことができ、終わったら「何かを止めさせる」ことができますか?それとも、私ができるトリックは他にありますか?

Nが50のときはすべてパフォーマンスが低下しますが、すべてがスムーズに動作するはずです。楕円がすべて同じ場所(透明度の高いもの)にあっても、全く問題はありません。

答えて

0

(オブジェクトのコピーはデフォルトでは作成されていませんが)一度固定されたオブジェクトをアンフリーズすることはできません。 WPFではデフォルトでダブルバッファリングも有効になっているため、ここでは取得できません。

パフォーマンスを向上させる方法がまだない場合は、軽量なのですべてのイベントを必要としない場合は、Ellipse Geometryのようにgeometry objectsを使用することをお勧めします。

このMSDNの記事Optimizing Performance: 2D Graphics and Imagingには、CachingHintが他のヒントと共に役立つことが示唆されています。例えばブラシ - それは、多くのパフォーマンスの向上outlined here

+0

私は「楕円」を意味していました。私のキャンバスの子供はEllipseGeometryインスタンスです。 WPFでもう少しGDI +のようなトリックがあるようです(スタイルをダブルクリックして少しでも遊ぶことができます)。 – sabiland

+0

EDIT:コメントのためのJohn&NirへのThx。 – sabiland

+0

私は答えを更新しました。 – John

0

を持っているよう

最後にあなたがFreezableから継承するオブジェクトのフリーズメソッドを呼び出す場合は、パフォーマンスが向上しますあなたは、最新のサービスパック1を使用していることを確認してください。

Freezableはグラフィックスシステムで処理する必要のある余分な変更通知をサポートしているため、オブジェクトをフリーズするときにオブジェクトが変更されなくなったため、変更通知がなくなりました。

この通知システムの例では、ブラシを作成する場合、ブラシを使用して(たとえば)矩形をペイントし、ブラシを変更して画面上の矩形の色を変更します。

4

タイマーではなく、CompositionTarget.Renderingイベントでレンダリングを試したことがありますか? Renderingイベントを使用して自分のダブルバッファリングを行うと、3Dスクリーンセーバーで印象的なパフォーマンスが得られました。(http://stuff.seans.com/2008/08/21/simple-water-animation-in-wpf/http://stuff.seans.com/2008/08/24/raindrop-animation-in-wpf/http://stuff.seans.com/2008/09/01/writing-a-screen-saver-in-wpf/を参照してください)

+0

Thx for info。記事を読んで "あなたの"方法をしようとします:)。 – sabiland

+1

Sean、「CompositionTarget.Rendering」メソッドを試しましたが、パフォーマンスの向上は全く見られませんでした。それから、別のヒント/トリックを見つけました。私が使用しているすべてのシェイプについて、IsHitTestVisibleをFALSEに設定します(もちろん、スクリーンセーバーとのユーザー対話は必要ありません)。それは少し助けて! – sabiland

+0

ヒットテストの変更が助けになったことをうれしく思います! –

関連する問題