1

バックグラウンド

現在、コントロールが大きすぎてバッファを割り当てられない場合に、ダブル バッファリングによってクラッシュが発生する動作を修正しようとしています。

多くの議論と試行錯誤の結果、サイズがサポートされている場合 (たとえば 3000x3000 ピクセル未満)、コントロールのダブル バッファリングを有効にすることが最善の方法であると判断しましたが、サイズのしきい値を超える場合は、プログラムでダブルバッファリングをオフにします。

GetStyle および SetStyle メソッドは保護されており、ダブル バッファリングを無効にする必要があるサード パーティ製のコントロールが多数あるため、これを行うのはかなり面倒です。これを克服するために、リフレクションを介してダブル バッファリングを無効にするヘルパー メソッドを作成しました。次に、Layout イベントを介してコントロールのサイズを監視し、それに応じて DoubleBuffer フラグと OptimizedDoubleBuffer フラグを設定します。

質問

私はリフレクションにあまり詳しくありません。私の主な質問は、MethodInfo.Invoke メソッドを介して ControlStyles を取得/設定することで、どのようなパフォーマンスへの影響を期待できるかということです。

特に、最初に値を読み取って DoubleBuffer/OptimizedDoubleBuffer ControlStyles を設定しないようにすることが役立つかどうか疑問に思っています (これは、リフレクションを介して GetStyle() を使用して行う必要もあります)。または、毎回 SetStyle() を呼び出すのは基本的に同じですか。Layout イベントが頻繁に呼び出されるので心配です。また、このダブル バッファリング トラッキング ロジックのためだけにパフォーマンスを大幅に低下させたくありません。

特に私がやっていることのパフォーマンスへの影響について、どんな入力も歓迎しますが、特定のサイズを超えた場合にのみコントロールのダブルバッファリングを無効にするためのより良いアイデアを誰かが持っている場合も同様です。

4

1 に答える 1

1

最初にスタイルを読んで、SetStyle を呼び出す必要があるかどうかを確認することをお勧めします。スタイルの設定にはコストがかかる可能性があります。

リフレクション アクセスの数が少ないことは、ダブル バッファーを割り当てて描画することに比べれば、実際には何もありません。考えないでください。

于 2012-06-05T21:40:58.250 に答える