1

C# にカスタム コントロールがあります。空の関数がある場合でも、呼び出しRefreshが思ったよりもずっと遅い (約 0.1ms) ことに気付きました。RePaint基本的に、私のアプリケーションはグリッドを処理し、各グリッド セルを 1 つずつ更新します。このかなり非効率的な動作は設計によるものです。有効にすると、処理の各ステップが何を行ったかを実際に確認できるようになり、各ステップは 1 つのセルのみを変更することになります。ダブルバッファリングを切り替えても、大きな違いはありません。

誰でもアドバイスを提供できますか?

現在、私が思いついた最善の改善は、 への呼び出しを へRefreshの呼び出しに置き換えることRefresh2です。後者の関数は の正確なコピーですがRepaint、先頭に追加された 2 行が にGraphics g = Graphics.FromHwnd(this.Handle); g.Clear(BackColor);置き換えe.Graphicsられていgます。これにはいくつかの欠点があるのではないかと疑っていますが、描画速度が半分になります。私が使用しているコントロールにはサブコンポーネントがないことに注意してください。そのため、検証などはそれほど重要ではありません。

4

2 に答える 2

2

更新しすぎると、経験どおりに速度が低下します。イベントを圧縮してみてください。つまり、新しいグリッドを取得したときに更新せず、更新が必要なときに変数を設定し、タイマーに1秒ごとにその変数をチェックさせて更新します。それから。

于 2009-05-09T20:15:44.667 に答える
0

更新は自動的に繰り返されるイベントですか、それともユーザー イベントに応答して行われますか?

最初のケースでは、(独自のスレッドで) 非同期にする必要があります。ユーザーイベントに応答する場合、「更新」がイベントにとって重要ではない場合にも当てはまります。

インターフェイスを更新するコードが遅すぎる場合は、インターフェイスの更新のみを行っていることを確認してください (データが既に準備されている必要があります..これは、ダブル バッファリングの流れに沿っています)。そうでない場合は、ログを記録して、時間がかかりすぎているものを見つけてください。

最初にデータを取得する必要がある場合は、多少の遅延が予想されます。それが受け入れられない場合は、何らかのキャッシュ メカニズムが必要になります。キャッシュを非同期で自動的に更新するか、キャッシュされたものを返し、新しいデータを取得してから、別の更新を行うことができます..またはその効果をもたらす何か。

于 2009-05-09T20:50:44.210 に答える