在创建一个新的表单之后,我通常会执行这样的仪式:
Caption;ShowHint设置为true;DoubleBuffered 将设置为 true;有一段时间我一直在想,为什么默认值是'False‘。在我看来,它只是低科技和拙劣,在我的新机器上,我没有注意到在性能上的任何差异。
在较旧的机器、VNC、远程桌面或虚拟机上,双缓冲可能有问题吗?
你是开着还是关着?有什么建议吗?
发布于 2009-09-11 02:17:22
您可能知道,双缓冲区通常涉及创建与可视组件大小相同的屏幕外内存缓冲区。在此缓冲区上执行写入/绘图,当完成时,整个缓冲区将被“交换”,以便现在将其绘制在可视组件上。
(注意:“交换”可能包括简单地更改指针指向的地址,或者实际上可能涉及复制内存块,例如使用BitBlt、memcpy等)
因此,为支持该进程所启用的每个组件分配了合理的内存量。如果您的应用程序有许多窗口或/或组件,那么分配的内存数量就不小了。如果您不需要平滑的视觉更新/滚动,为什么要浪费这个内存?
当然,也有一种观点认为,今天大多数电脑都有足够的内存,所以为什么要担心呢?但是,如果不需要,我仍然不认为这是默认启用双缓冲的理由。
如果手动将DoubleBuffered设置为true对您来说很痛苦,那么始终可以创建您自己的自定义控件/组件,该控件继承于内置控件,并将DoubleBuffered (和其他属性)设置为所需的默认值。
发布于 2009-09-11 05:47:35
在执行某种远程桌面时,要避免双重缓冲,因为必须通过网络发送控件/窗体的整个位图才能执行BitBlt。见这篇博客文章..。
发布于 2009-09-11 05:21:10
在做桌面组合的现代操作系统上,双缓冲实际上可能会降低性能。渲染无论如何都是在屏幕外的位图中执行的,所以使用双缓冲会导致额外的复制,而在这些系统上根本没有好处。因此,除非VCL足够聪明地忽略这种情况下的双缓冲(不知道是否需要检查),否则实际上最好不要无条件地设置它。
编辑:
我检查了,在Delphi2007和Delphi2009中,TWinControl.WMPaint方法在DwmCompositionEnabled返回True时不使用双重缓冲。好的。
https://stackoverflow.com/questions/1408664
复制相似问题