2010-11-24 20 views
7

メインウィンドウを持つWPFアプリケーション(.NET 4)があり、そのメインウィンドウ内に多くの小さなUserControlsが表示されています。ユーザによって実行される様々な動作は、表示されるUserControlsを、異なるデータを有する異なる他の制御に置き換えさせる。WPF InitializeComponentのパフォーマンス上の問題

ただし、これらのコントロールを切り替えるときにパフォーマンスの問題が発生しています。 WPFディスパッチャスレッドは、コントロールをロードしている間に100%CPUに移動します。古いマシンや多数のコントロールを使用すると、アプリケーションが30秒間ロックアップするように見えることがあります。一方の制御が他のよりもはるかに悪いように見えるがないが、それらはすべて0.2〜0.5秒かかるように見える(上 -

プロファイリングはほぼすべてこのCPU時間がすべて異なるUserControlsの様々なInitializeComponentメソッドを呼び出す費やされていることを示しています高速プロセッサと優れたグラフィックスカードを備えた私の開発マシン)。

私が知る限り、InitializeComponentは、実際にWPFがコンパイルしたxamlをメモリにロードする場所です。

私はここで何をするのか迷っています。バックグラウンドスレッドで事前に初期化したいのですが、すべてのWPFコントロールを作成してディスパッチャスレッドで使用する必要があるため、これは可能ではないと思います。

それ以外の場合は、私のすべてのxamlを削除するオプションがありますか?

それは論理/ビジュアルツリー内のコントロールを挿入し、すべてのバインディングを保証する、テーマする必要があるため、すべてのヘルプは大幅に

+1

あなたのアプリ(特定の詳細+コード)について詳しく知ることなく、あなたは膨大な量のユーザーコントロール(+50)や非常に重いデータバインディングを持っていることが想像できます。唯一の答えは、アプリケーションロジックを再設計することです。あなたが理解しなければならないことは、大量のコントロール/データに関しては、WPFが非常に最適化されていないため(フレームワークが高すぎると思うので)、全く駄目です。おそらくあなたのアプリのためにWinFormsを試してみてください(これはもう少しです)。ネイティブC++/directx(a'la Photoshop、AutoCADスタイル)のすべてを書きます。 – Marko

+0

http://jeremiahmorrill.wordpress.com/2011/02/14/a-critical -deep-dive-into-the-wpf-rendering-system/- 私はコントロールがロードされていると思います。あなたが試してみたいかもしれないPIX(WPF perfツール)について言及しています。 – gbjbaanb

答えて

0

をいただければ幸いInitializeComponent方法は時間がかかり、期待される資源など

私の唯一の提案すべての潜在的なコントロールを最初から初期化し、必要に応じてVisibilityプロパティを使用してそれらを表示/非表示することは可能ですか?

Freezableを使用してUIをキャッシュすることはできますが、ユーザーコントロールの場合は、ユーザーとのやりとりが必要になる可能性が高くなります。

+0

答えに感謝しますが、当初はすべてのコントロールを読み込み、必要なものだけを表示していました。フォームが最初に表示されたときに、遅いマシンでは1分以上の巨大な遅延がありました。これは現在の動作よりもさらに悪いユーザーエクスペリエンスでした:-( –

2

これを再訪するには、画面上に多数の複雑なコントロールがありますが、WPFを幸せにするためにそれらを取り除くことはできません。

詳細な実験では、カスタムコントロール(基本的にControlから派生し、Generic.xamlテーマファイル内のUIを定義するだけのC#クラスはXAMLの読み込みと解析のヒットを招くように見えます)ただ、既存のテーマを適用します。

カスタムコントロールは、ユーザーコントロールよりも、で動作するようにはるかに困難ですが、これは私たちの負荷性能多くを助けるように見えました。

0

記録のために、私は持つウィンドウを持っていました負荷時間約1500〜2000ミリ秒、問題はアイコンでした。

それは大規模解析しなければならなかったので、私はXAML DrawingImage要素にSVGを変換するためのツールを使用して、すべての使用されるアイコン

のInitializeComponentのための画像描画を有する大きなリソース辞書とユーザーコントロールが非常に遅かった

イメージのすべてのベクトルデータを含むXAMLファイル

希望すると助かります。

関連する問題