最近、コードにいくつかの最適化を加えましたが、テスト後の効果は問題ありませんでしたが、インターフェイスがちらつき、具体的には TreeView コントロールがちらつき、言語が C#、IDE が VS2005 であることがわかりました。いくつかの情報を参照し、いくつかの基本的なテクニック (ダブル バッファリングをオンにするなど) を使用したところ、効果がないことがわかりました。
そこで、PRfiler ツールを使用して、毎回インターフェイスを更新した後の EndUpdate 操作にボトルネックがあることを確認しました (これはインターフェイスの更新数を減らすために使用されますが、コントロールには多くの要素があるため、ここでは理想的ではありません)。更新される度に.Netの最下層の各プリミティブが更新されて再描画されるので速度が遅くちらつきが発生すると思われます。ただし、この場合は、ダブル バッファリングを使用した方が良い結果が得られるはずです。改めてコードを見てみると、更新動作が頻繁すぎるのではないかと思い、速度を落として改善しましたが、やはり動作しませんでした。
オンラインで検索を続け、最終的により適切なソリューションを見つけます。基本的な再描画が毎回キャンバスをクリアしてからすべて再描画することが、ちらつきの主な原因であることがわかりました。そのため、メッセージ送信機能の操作が過負荷になり、このメッセージは無効になります。コードは次のとおりです。
protected オーバーライド void WndProc(ref Message m)
{
if (m.Msg == 0x0014) // バックグラウンドメッセージのクリアを無効にする
戻る;
Base.WndProc(ref m);
}
成功!
注: ダブル バッファリングは、更新がそれほど頻繁ではなく、コントロールに含まれる要素が多すぎない場合には依然として役立ちます。要素が多すぎると、ダブルバッファリングを使用しても、毎回の更新に時間がかかります。ちらつきの問題は解決できません。個人的には、最終的にバックグラウンドメッセージを無効にしてクリアするのが理想的な方法だと思います。
添付ファイル: 試みと失敗の記録
1) setStyle を使用する
インターネットでは、setStyle 関数はコントロールのパラメーターを設定するために使用されると言われています。具体的には次のとおりです。
SetStyle(ControlStyles.UserPaint | ControlStyles.AllPaintingInWmPaint | ControlStyles.OptimizedDoubleBuffer, true);
これら 3 つのオプション パラメーターのうち後者は前者に依存するため、共存する必要があります。共存しないと無効になります。そして、この関数自体は保護されているため、使用する前にまず特定のコントロールを継承する必要があります。
この目標は、背景のクリアを無効にしてダブル バッファリングをオンにする以前の正しい解決策と一致していますが、ユーザー描画オプションが必要であり、すべての描画はユーザーによって行われます。この場合、コントロールの描画をすべて自分で実装する必要があり、非常に面倒です。したがって、この方法は完全に実行不可能というわけではありませんが、追加の作業が必要となるため、お勧めできません。私も使いませんでした。
2) BeginUpdate と EndUpdate を使用する
この操作のペアは、初期化中に多数のノードをバッチで追加するなど、コントロールを更新するためにバッチ操作が必要なシナリオでより効果的です。デメリットは、すぐに更新できないことです。したがって、ノードが頻繁に更新され、すぐにインターフェースに反映させたい状況には適していません。これを使用し、クリア インターフェイス メッセージを無効にしない場合、コントロールがちらつくように見え、背景は主に白になり、コンテンツはほとんど見えなくなります (ビデオの複雑さに応じて)。インターフェイスの更新は EndUpdate で完了するため、操作が多すぎると EndUpdate が長時間ブロックされ、インターフェイスが最初にクリアされ、後で更新されるため、インターフェイスが長時間空白で表示されます。
3) ControlStyles.EnableNotifyMessage オプションを使用する
このオプションの効果も、正しい解決策と一致します。使用方法は次のとおりです。
SetStyle(ControlStyles.EnableNotifyMessage, true);
protected オーバーライド void onNotifyMessage(Message m)
{
//ここにフィルターメッセージのコードを書きます
}
しかし、実際の実験では効果がなかったので、詳しく調べたわけではありません。
-