采用四缓冲提高自绘界面的效率

做过自绘的朋友都知道,如果直接画到窗口DC上,频繁更新会导致窗口比较闪。所以大家都喜欢使用双缓冲解决这个问题。(即先画到内存DC,全部画完了再一次复制到窗口DC上)。
在编写DirectUI界面时,子控件并不是真实存在的窗口,只是直接画到同一个窗口上的一些子区域。如果每一个子控件更新状态(比如获取焦点、鼠标热点及按下等状态)都重画所有子控件,那效率就低了,采用GDIPlus时这个效率的区别更明显,CPU占用率特别高。
为解决这个问题,我在编写“彗星小助手”时采用了更多的缓存。只根据需要更新某一控件的状态。

缓存A->保存整个窗口的背景(只在窗口尺寸改变时更新)
缓存B->在A的基础上,画出所有子控件
缓存C->复制B,复制当前重画子控件(比如“正则调试”这个子控件)所占区域的背景(即A),再画出子控件(正则调试)的最新状态,最后复制到窗口DC(假设为D)。

这样做,保存了更多GDI对象,内存占用会稍高,但是CPU占用大幅度降低,不会因为子控件过多而导致“卡”一下的现象。子控件越多越明显。

在这里,包括窗口DC在内,一共采用了四个DC,或许应该叫四缓冲吧,呵呵。

示意图如下:

采用四缓冲提高自绘界面的效率_第1张图片

你可能感兴趣的:(采用四缓冲提高自绘界面的效率)