私は現在、WPF リッチ クライアント LOB アプリケーションのパフォーマンスの問題に関連する顧客の割り当てで働いています。
問題は、アプリケーションの実行が非常に遅い/遅いことです。特に、データ テーブルの処理 (スクロール、並べ替え、選択) は非常に遅く、アプリケーションが使用できなくなります。
いくつかのテキストボックス、コンボボックス、およびラベルを含む 1 つのタブが開かれ、アイドル状態 (ユーザーの入力待ち) になったときのシステム状態を分析しました。
これらは私の発見です:
- すべてのレンダリングは GPU で計算されます
- アニメーション、ビットマップ効果、透明度などのパフォーマンスの高い機能はありません。
- タブがアイドル状態の場合 (フォーカスされたテキスト ボックス内でカーソルのみが点滅し、タブの残りの部分は静的で、データさえ含まれていません)、GPU は最大 90% 実行されます。
- タブがフォーカスを失うたびに GPU が 0 に落ちる
- GPU の割合は、ウィンドウ サイズに直接関係します。小さなウィンドウでは数パーセントに下がり、全画面表示ではほぼ 100% になります
- WPF Perforator は、WPF が点滅カーソルだけでなく、タブ全体のダーティ領域を計算することを教えてくれます
- WPF Perforator は、アイドル タブで 20/秒を超えるダーティ rect 更新レートを報告し、GPU 使用率に直接相関します
私の結論: 開発中に、システム全体のバックエンド駆動型アーキテクチャに WPF を適合させるために、多くのカスタム コード (レイアウト、イベント処理など) が導入されました。私の推測では、一部のカスタム コードが原因で、WPF の dirty-rect-mechanism が壊れています。これにより、描画アクティビティが過剰になり、GPU 使用率が非常に高くなります。これらの不必要な活動は、上記の問題につながります。
今、私は調査をどこから始めるべきかアドバイスを探しています。言い換えれば、開発者が WPF ダーティ rect 更新アルゴリズムを破るために犯す可能性のある典型的な間違いは何ですか。どんな入力でも大歓迎です。
これからもよろしくお願いします!
マヌエル