25

创建新表格后,我通常会执行以下仪式:

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

我一直想知道为什么默认值为“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

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

编辑:

我检查了,在 Delphi 2007 和 Delphi 2009 中,该方法在返回TWinControl.WMPaint时不使用双缓冲。好的。DwmCompositionEnabledTrue

于 2009-09-11T05:21:10.513 回答
1

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

于 2011-03-21T21:01:20.993 回答