首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么默认情况下禁用DoubleBuffered?

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

Stack Overflow用户
提问于 2009-09-11 02:07:43
回答 4查看 11.8K关注 0票数 25

在创建一个新的表单之后,我通常会执行这样的仪式:

  1. 把名字改成有意义的东西;
  2. A型Caption
  3. 更改位置属性(DefaultPosOnly几乎不符合用户的期望);
  4. ShowHint设置为true
  5. DoubleBuffered 将设置为 true

有一段时间我一直在想,为什么默认值是'False‘。在我看来,它只是低科技和拙劣,在我的新机器上,我没有注意到在性能上的任何差异。

在较旧的机器、VNC、远程桌面或虚拟机上,双缓冲可能有问题吗?

你是开着还是关着?有什么建议吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2009-09-11 02:17:22

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

(注意:“交换”可能包括简单地更改指针指向的地址,或者实际上可能涉及复制内存块,例如使用BitBlt、memcpy等)

因此,为支持该进程所启用的每个组件分配了合理的内存量。如果您的应用程序有许多窗口或/或组件,那么分配的内存数量就不小了。如果您不需要平滑的视觉更新/滚动,为什么要浪费这个内存?

当然,也有一种观点认为,今天大多数电脑都有足够的内存,所以为什么要担心呢?但是,如果不需要,我仍然不认为这是默认启用双缓冲的理由。

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

票数 32
EN

Stack Overflow用户

发布于 2009-09-11 05:47:35

在执行某种远程桌面时,要避免双重缓冲,因为必须通过网络发送控件/窗体的整个位图才能执行BitBlt。见这篇博客文章..。

票数 26
EN

Stack Overflow用户

发布于 2009-09-11 05:21:10

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

编辑:

我检查了,在Delphi2007和Delphi2009中,TWinControl.WMPaint方法在DwmCompositionEnabled返回True时不使用双重缓冲。好的。

票数 13
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1408664

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档