![](/img/trans.png)
[英]Why is Assignable typed constants disabled in my Delphi 7 by default?
[英]Why is DoubleBuffered disabled by default?
创建新表单后,我通常会执行此仪式:
Caption
; ShowHint
设置为true
; DoubleBuffered
设置为true
; 我一直想知道为什么默认值为'False'。 对我来说,它只是看起来低技术和蹩脚,在我的新机器上,我没有注意到性能上的任何差异。
在旧机器,VNC,远程桌面或虚拟机中双重缓冲是否有问题?
你把它打开还是关闭? 有什么建议?
您可能知道,双缓冲区通常涉及创建与可视组件大小相同的屏幕外内存缓冲区。 在此缓冲区上执行写入/绘制,完成后,“交换”整个缓冲区,以便现在将其绘制在可视组件上。
(注意:“交换”可能只是简单地改变指针指向的地址,或者实际上可能涉及复制一块内存,例如使用BitBlt,memcpy等)
因此,为其启用的每个组件分配了合理数量的内存来支持此过程。 如果您的应用程序有许多窗口或/和组件,则会分配不可忽略的内存量。 如果您不需要平滑的视觉更新/滚动,为什么要浪费这些记忆?
当然还有一种说法,即今天大多数计算机都有足够的内存,所以为什么要担心。 但是,如果您不需要,我仍然不会将此视为默认启用Double Buffering的原因。
如果手动将DoubleBuffered设置为true对您来说很麻烦,您可以始终创建自己的继承自内置控件的自定义控件/组件,并将DoubleBuffered(和其他属性)设置为所需的默认值。
在进行某种类型的远程桌面时应避免双缓冲,因为控制/表单的整个位图必须通过网络发送以执行BitBlt。 看到这篇博文 ...
在桌面合成的现代操作系统上,双缓冲实际上可能会降低性能。 无论如何,渲染都会执行到屏幕外的位图,因此使用双缓冲会导致额外的复制,在这些系统上完全没有任何好处。 因此,除非VCL足够聪明,在这种情况下忽略双缓冲(不知道是否存在,需要检查),实际上最好不要无条件地设置它。
编辑:
我检查过,在Delphi 2007和Delphi 2009中,当DwmCompositionEnabled
返回True
时, TWinControl.WMPaint
方法不使用双缓冲。 尼斯。
您还可以创建一个设计时专家,为您创建的每个表单/控件自动设置此值,而不是为每个涉及更多工作的现有表单/控件派生新控件。 请参阅GExperts.org的源代码以了解如何实现此目的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.