繁体   English   中英

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

[英]Why is DoubleBuffered disabled by default?

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

  1. 将名称更改为有意义的名称;
  2. 输入Caption ;
  3. 更改位置属性(DefaultPosOnly几乎不是用户期望的);
  4. ShowHint设置为true ;
  5. 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM