您的位置:首页 > 其它

陈灯WGF双缓冲绘图框架之gdi及gdiplus实现双缓冲时存在的效率问题及解决办法

2008-08-01 18:35 429 查看
“木丸子童屋”,专售各类儿童玩具,价格优惠,请大家多多支持:http://shop65552598.taobao.com/

a) 双缓冲绘图潜在的效率问题
双缓冲刷新技术是一项解决刷屏时存在的屏幕闪烁问题的有效方法。这种方法通过将图形绘制在与窗口设备上下文兼容的后备缓冲区中然后通过内存拷贝到前端缓冲区进行显示的方式实现。双缓冲刷新技术通常在需要进行实时图形显示的情况下使用,因为屏幕闪烁问题在高速刷新的情况下较为明显。如果将所有的绘图场景不加区分的在每一次刷新时都进行重绘,双缓冲刷新技术是低效的,但是这种状况可以通过引入一个与窗口设备上下文兼容的内存静态设备描述表加入改进。通常情况下,绘图的场景可以划分为静态场景和动态场景,静态场景是指位置和各种图形属性不随时间发生变化的场景,例如一个足球场地;动态场景是指位置或者图形属性随时间发生变化的场景,例如足球场上的足球和运动员。在采用双缓冲技术进行绘图时,可以通过对静态场景进行特殊处理以减少重绘时的任务量,方法是在第一次进行屏幕刷新时将静态场景绘制在一个与窗口设备上下文兼容的内存静态设备描述表中,在以后重绘时则不需要再次重新绘制静态场景而只需要将保存在内存静态设备描述表中的静态场景拷贝到后备缓冲区中,然后再将动态场景直接绘制在后备缓冲区中,最后将整个后备缓冲内容拷贝到前端缓冲区完成整个双缓冲绘图过程。该方法的原理是因为静态场景不会随着时间发生变化,因此不需要每一次刷新时都进行重绘,而只需要在绘图区域的大小发生改变时重绘即可。使用这种方法的额外开销是引入了一个内存静态设备描述表,但是这种开销所换取的效率在内存廉价的今天是微不足道的。
b) 效率低下的gidplus
Gdiplus相对于gdi来说功能更为强大,主要表现在gdiplus支持矩阵操作并且gdiplus具有反锯齿的功能,可以绘制出相对平滑的曲线。但是强大的功能通常是需要代价的,gdiplus是直接使用CPU进行绘图,使用gdiplus在开启反锯齿的情况下绘制简单的几条曲线也会导致CPU占用率明显上升,因此通过区分静态场景和动态场景以减少重绘时的CPU工作量在gdiplus绘图过程中具有更加重要的意义。但是不幸的是gdiplus中没有gdi中位拷贝(BitBlt())那样快速高效的内存拷贝函数,相形之下有一个性能极其糟糕的DrawImage()函数。解决的办法是采用gdi和gdiplus混合编程,即采用gdiplus的绘图函数将静态场景绘制到一个与Graphics绘图对象对应的内存静态设备描述表中,然后再使用gdi中的位拷贝方法进行内存拷贝。

陈灯WGF双缓冲绘图框架完成了以上功能,下载地址及源码如下:

地址1:http://download.csdn.net/source/565974

地址2:http://cn.ziddu.com/download/214065/WGF.rar.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐