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

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

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

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

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

示意图如下:

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值