为什么默认情况下禁用DoubleBuffered?

时间:2009-09-11 02:07:44

标签: delphi delphi-2009 doublebuffered

创建新表单后,我通常会执行此仪式:

  1. 将名称更改为有意义的内容;
  2. 键入Caption;
  3. 更改位置属性(DefaultPosOnly几乎不是用户期望的那样);
  4. ShowHint设为true;
  5. DoubleBuffered设为true ;
  6. 我一直想知道为什么默认值为'False'。对我来说,它只是看起来低技术和蹩脚,在我的新机器上我没有注意到性能上的任何差异。

    在旧机器,VNC,远程桌面或虚拟机中双重缓冲是否有问题?

    你是打开还是关闭?有什么建议吗?

4 个答案:

答案 0 :(得分:32)

您可能知道,双缓冲区通常涉及创建与可视组件大小相同的屏幕外内存缓冲区。在此缓冲区上执行写入/绘制,完成后,“交换”整个缓冲区,以便现在将其绘制在可视组件上。

(注意:“交换”可能只是简单地改变指针指向的地址,或者实际上可能涉及复制一块内存,例如使用BitBlt,memcpy等)

因此,为其启用的每个组件分配了合理数量的内存来支持此过程。如果您的应用程序有许多窗口或/和组件,则会分配不可忽略的内存量。如果您不需要平滑的视觉更新/滚动,为什么要浪费这些记忆?

当然还有一种说法,即今天大多数计算机都有足够的内存,所以为什么要担心。但是,如果您不需要,我仍然不会将此视为默认启用Double Buffering的原因。

如果手动将DoubleBuffered设置为true对您来说很麻烦,您可以始终创建自己的继承自内置控件的自定义控件/组件,并将DoubleBuffered(和其他属性)设置为所需的默认值。

答案 1 :(得分:25)

在进行某种类型的远程桌面时应避免双缓冲,因为控制/表单的整个位图必须通过网络发送以执行BitBlt。见this blog post ...

答案 2 :(得分:12)

在桌面合成的现代操作系统上,双缓冲实际上可能会降低性能。无论如何,渲染都会执行到屏幕外的位图,因此使用双缓冲会导致额外的复制,在这些系统上完全没有任何好处。因此,除非VCL足够聪明,在这种情况下忽略双缓冲(不知道是否存在,需要检查),实际上最好不要无条件地设置它。

修改

我检查过,在TWinControl.WMPaint返回DwmCompositionEnabled时,True方法在Delphi 2007和Delphi 2009中都不使用双缓冲。好的。

答案 3 :(得分:1)

您还可以创建一个设计时专家,为您创建的每个表单/控件自动设置此值,而不是为每个涉及更多工作的现有控件创建新控件。 请参阅GExperts.org的源代码,了解如何实现这一目标。