创建新表格后,我通常会执行以下仪式:
- 把名字改成有意义的;
- 输入一个
Caption
; - 更改位置属性(DefaultPosOnly 几乎不是用户期望的);
- 设置
ShowHint
为true
; - 设置
DoubleBuffered
为true
;
我一直想知道为什么默认值为“False”。对我来说,它只是看起来技术含量低且蹩脚,在我的新机器上我没有注意到性能上有任何差异。
双缓冲在旧机器、VNC、远程桌面或虚拟机上是否存在问题?
你把它打开还是关闭?有什么建议吗?
创建新表格后,我通常会执行以下仪式:
Caption
;ShowHint
为true
;DoubleBuffered
为true
; 我一直想知道为什么默认值为“False”。对我来说,它只是看起来技术含量低且蹩脚,在我的新机器上我没有注意到性能上有任何差异。
双缓冲在旧机器、VNC、远程桌面或虚拟机上是否存在问题?
你把它打开还是关闭?有什么建议吗?
您可能知道,双缓冲区通常涉及创建与可视组件大小相同的屏幕外内存缓冲区。在此缓冲区上执行写入/绘图,完成后,整个缓冲区被“交换”,以便现在将其绘制在可视组件上。
(注意:“交换”可能包括简单地更改指针指向的地址,或者实际上可能涉及复制一块内存,例如使用 BitBlt、memcpy 等)
因此,为启用该进程的每个组件分配了合理数量的内存来支持该进程。如果您的应用程序有许多窗口或和/或组件,则分配的内存量将不小。如果您不需要平滑的视觉更新/滚动,为什么要浪费这些内存?
当然,还有一种说法是,今天大多数计算机都有足够的内存可用,所以何必担心。但是,如果您不需要它,我仍然不认为这是默认启用双缓冲的理由。
如果手动将 DoubleBuffered 设置为 true 对您来说很痛苦,您始终可以创建自己的自定义控件/组件,该控件/组件继承自内置控件,并将 DoubleBuffered(和其他属性)设置为所需的默认值。
在执行某种远程桌面时应避免双缓冲,因为必须通过网络发送控件/表单的整个位图才能执行 BitBlt。看到这篇博文...
在执行桌面合成双缓冲的现代操作系统上,实际上可能会降低性能。无论如何,渲染都是在屏幕外的位图中执行的,因此使用双缓冲会导致额外的复制,而在这些系统上根本没有任何好处。因此,除非 VCL 足够聪明,可以在这种情况下忽略双缓冲(不知道是否这样做,需要检查),否则实际上最好不要无条件地设置它。
编辑:
我检查了,在 Delphi 2007 和 Delphi 2009 中,该方法在返回TWinControl.WMPaint
时不使用双缓冲。好的。DwmCompositionEnabled
True
您还可以创建一个设计时专家,为您创建的每个表单/控件自动设置此值,而不是为每个现有的控件派生新控件,这将涉及更多工作。请参阅 GExperts.org 上的源代码以了解如何实现此目的。