メインウィンドウを持つWPFアプリケーション(.NET 4)があり、そのメインウィンドウ内に多くの小さなUserControls
が表示されています。ユーザによって実行される様々な動作は、表示されるUserControls
を、異なるデータを有する異なる他の制御に置き換えさせる。WPF InitializeComponentのパフォーマンス上の問題
ただし、これらのコントロールを切り替えるときにパフォーマンスの問題が発生しています。 WPFディスパッチャスレッドは、コントロールをロードしている間に100%CPUに移動します。古いマシンや多数のコントロールを使用すると、アプリケーションが30秒間ロックアップするように見えることがあります。一方の制御が他のよりもはるかに悪いように見えるがないが、それらはすべて0.2〜0.5秒かかるように見える(上 -
プロファイリングはほぼすべてこのCPU時間がすべて異なるUserControls
の様々なInitializeComponent
メソッドを呼び出す費やされていることを示しています高速プロセッサと優れたグラフィックスカードを備えた私の開発マシン)。
私が知る限り、InitializeComponent
は、実際にWPFがコンパイルしたxamlをメモリにロードする場所です。
私はここで何をするのか迷っています。バックグラウンドスレッドで事前に初期化したいのですが、すべてのWPFコントロールを作成してディスパッチャスレッドで使用する必要があるため、これは可能ではないと思います。
それ以外の場合は、私のすべてのxamlを削除するオプションがありますか?
それは論理/ビジュアルツリー内のコントロールを挿入し、すべてのバインディングを保証する、テーマする必要があるため、すべてのヘルプは大幅に
あなたのアプリ(特定の詳細+コード)について詳しく知ることなく、あなたは膨大な量のユーザーコントロール(+50)や非常に重いデータバインディングを持っていることが想像できます。唯一の答えは、アプリケーションロジックを再設計することです。あなたが理解しなければならないことは、大量のコントロール/データに関しては、WPFが非常に最適化されていないため(フレームワークが高すぎると思うので)、全く駄目です。おそらくあなたのアプリのためにWinFormsを試してみてください(これはもう少しです)。ネイティブC++/directx(a'la Photoshop、AutoCADスタイル)のすべてを書きます。 – Marko
http://jeremiahmorrill.wordpress.com/2011/02/14/a-critical -deep-dive-into-the-wpf-rendering-system/- 私はコントロールがロードされていると思います。あなたが試してみたいかもしれないPIX(WPF perfツール)について言及しています。 – gbjbaanb