25

新しいフォームを作成した後、私は通常、この儀式を実行します。

  1. 名前を意味のあるものに変更します。
  2. a Caption;と入力します。
  3. 位置プロパティを変更します(DefaultPosOnlyはユーザーが期待するものではありません)。
  4. ShowHintに設定true;
  5. DoubleBufferedに設定true;

なぜデフォルト値が「False」なのか、しばらく疑問に思っていました。私にはそれはローテクでくだらないように見えます、そして私の新しいマシンではパフォーマンスの違いに気づきません。

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

オンのままにしますか、それともオフのままにしますか?何かお勧めはありますか?

4

4 に答える 4

32

ご存知かもしれませんが、ダブルバッファには通常、ビジュアルコンポーネントと同じサイズのオフスクリーンメモリバッファを作成する必要があります。書き込み/描画はこのバッファで実行され、完了すると、バッファ全体が「スワップ」されて、ビジュアルコンポーネントにペイントされます。

(注:「スワッピング」は、ポインターが指すアドレスを変更するだけの場合もあれば、BitBlt、memcpyなどを使用するなど、実際にメモリのチャンクをコピーする場合もあります)

したがって、有効になっているコンポーネントごとに、このプロセスをサポートするために割り当てられた妥当な量のメモリ。アプリケーションに多くのウィンドウやコンポーネントがある場合、割り当てられるメモリの量はそれほど多くありません。スムーズな視覚的更新/スクロールが必要ない場合、なぜこのメモリを浪費するのですか?

もちろん、今日ほとんどのコンピュータには十分なメモリがあるという議論もあります。なぜ心配するのですか。ただし、これが不要な場合にデフォルトでダブルバッファリングを有効にする理由としてはまだわかりません。

DoubleBufferedを手動でtrueに設定するのが面倒な場合は、組み込みのコントロールを継承し、DoubleBuffered(およびその他のプロパティ)を必要なデフォルトに設定する独自のカスタムコントロール/コンポーネントをいつでも作成できます。

于 2009-09-11T02:17:22.443 に答える
26

ある種のリモートデスクトップを実行する場合は、ダブルバッファリングを回避する必要があります。これは、BitBltを実行するには、コントロール/フォームのビットマップ全体をネットワーク経由で送信する必要があるためです。このブログ投稿を参照してください...

于 2009-09-11T05:47:35.887 に答える
13

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

編集:

チェックしたところ、Delphi2007とDelphi2009の両方で、メソッドは戻り値のTWinControl.WMPaintときにダブルバッファリングを使用していません。良い。DwmCompositionEnabledTrue

于 2009-09-11T05:21:10.513 に答える
1

また、多くの作業を伴う既存のすべてのコントロールに対して新しいコントロールを導出する代わりに、作成するすべてのフォーム/コントロールに対してこの値を自動的に設定する設計時のエキスパートを作成することもできます。これを実現する方法については、GExperts.orgのソースコードを参照してください。

于 2011-03-21T21:01:20.993 に答える