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

Wou*_*ick 25 delphi doublebuffered delphi-2009

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

  1. 将名称更改为有意义的名称;
  2. 输入Caption;
  3. 更改位置属性(DefaultPosOnly几乎不是用户期望的);
  4. 设置ShowHinttrue;
  5. 设置DoubleBufferedtrue ;

我一直想知道为什么默认值为'False'.对我来说,它只是看起来低技术和蹩脚,在我的新机器上,我没有注意到性能上的任何差异.

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

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

Ash*_*Ash 32

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

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

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

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

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

  • 当'DoubleBuffered`为真时,控件响应绘制这样的消息:它创建一个位图,绘制到位图,调用`BitBlt`将位图复制到窗口,然后销毁位图.它不仅仅是一个简单的指针交换. (13认同)

Fra*_*ois 25

在进行某种类型的远程桌面时应避免双缓冲,因为控制/表单的整个位图必须通过网络发送以执行BitBlt.看到这篇博文 ...

  • +1太棒了.你指出它的那一刻就显而易见了,但我从未想过会出现这种情况.那将导致我重新考虑我的一些程序....感谢你指出这一点! (3认同)

mgh*_*hie 13

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

编辑:

我查了一下,在Delphi 2007和Delphi 2009中,该TWinControl.WMPaint方法在DwmCompositionEnabled返回时不使用双缓冲True.尼斯.