2009-09-11 21 views
25

新しいフォームを作成した後、私は通常、この儀式行いますDoubleBufferedがデフォルトで無効になっているのはなぜですか?

  1. 変更有意義なものに名前を。
  2. Captionを入力してください。
  3. 位置プロパティを変更します(DefaultPosOnlyはユーザーの期待するものです)。
  4. セットShowHint~true;
  5. セットDoubleBuffered~true;

私はしばらくの間、デフォルト値が「偽」であることを疑問に思いました。私にとっては、それはちょうどローテクで泥棒に見えます。私の新しいマシンでは、パフォーマンスに違いは見られません。

古いマシン、VNC、リモートデスクトップまたはバーチャルマシンでダブルバッファリングに問題がありますか?

あなたはそれをオンまたはオフにしますか?どんな勧告?

答えて

32

おそらく二重バッファには、ビジュアルコンポーネントと同じサイズのオフスクリーンメモリバッファを作成する必要があります。描画/描画はこのバッファ上で実行され、完了するとバッファ全体が「スワップ」され、ビジュアルコンポーネントに描画されます。

は(注:単にアドレスポインタポイントを変更からなっていてもよい、または実際にそのようなのmemcpyなどのBitBltを使用するなどのメモリのチャンクをコピー含むことができる「スワッピング」)に割り当てられたメモリのため

を妥当な量これが有効になっている各コンポーネントに対してこのプロセスをサポートします。アプリケーションに多数のウィンドウやコンポーネントがある場合は、あまり重要でない量のメモリが割り当てられます。滑らかな視覚的な更新/スクロールが必要ない場合、なぜこのメモリを無駄にするのでしょうか?

もちろん、今日のほとんどのコンピュータには余裕があり、なぜ心配しているのでしょうか?しかし、私はまだダブルバッファリングが必要ない場合に有効にすることをデフォルトにする理由としてこれを見ていません。

手動でDoubleBufferedをtrueに設定することは苦痛ですが、組み込みコントロールから継承する独自のカスタムコントロール/コンポーネントを作成し、DoubleBuffered(およびその他のプロパティ)を必要な既定値に設定することができます。

+1

+1すてきな答え。 Nitpick:「すばやくコピーした」を「スワップされた」または実際にバッファコピーが行われているという印象を与えないものに置き換えます。通常、バッファスワップは単純なポインタスワップです。 –

+0

良い点、私は答えを更新しました。もちろん、Windows Forms.NETには実際にはメモリコピーである "ふり"のダブルバッファリングもあります。 – Ash

+11

'DoubleBuffered'が真の場合、コントロールは次のようなペイントメッセージに応答します。ビットマップを作成し、ビットマップにペイントし、BitBltを呼び出してビットマップをウィンドウにコピーし、ビットマップを破棄します。単なるポインタスワップではありません。 –

12

デスクトップの合成を行う最新のOSでは、ダブルバッファリングはパフォーマンスを実際に低下させる可能性があります。いずれにしても、レンダリングはオフスクリーンのビットマップに実行されるため、ダブルバッファリングを使用すると余分なコピーが発生し、これらのシステムでは何のメリットもありません。 VCLがそのような場合にダブルバッファリングを無視するほどスマートでない限り(チェックする必要があるかどうかはわかりません)、無条件に設定しないほうが良いかもしれません。

編集:

私がチェックし、DwmCompositionEnabledTrueを返すときのDelphi 2007とDelphi 2009の両方にTWinControl.WMPaint方法は、ダブルバッファリングを使用していません。ニース。

25

BitBltを実行するために、コントロール/フォームのビットマップ全体がネットワークを介して送信される必要があるため、何らかの種類のリモートデスクトップを実行するときは、ダブルバッファリングを避ける必要があります。 this blog postを参照してください...

+3

+1素晴らしいです。あなたがそれを指摘した分は分かりましたが、これは私には起こりませんでした。それは私のプログラムのいくつかを再考させるでしょう....これを指摘してくれてありがとう! – robsoft

+0

+1は上記の内容に同意します。 – user271077

1

また、作成したすべてのフォーム/コントロールに対して、この値を自動的に設定するデザイン時エキスパートを作成することもできます。 これを実現する方法を知るには、GExperts.orgのソースコードを参照してください。

関連する問題