a)    双缓冲绘图潜在的效率问题    双缓冲刷新技术是一项解决刷屏时存在的屏幕闪烁问题的有效方法。这种方法通过将图形绘制在与窗口设备上下文兼容的后备缓冲区中然后通过内存拷贝到前端缓冲区进行显示的方式实现。双缓冲刷新技术通常在需要进行实时图形显示的情况下使用,因为屏幕闪烁问题在高速刷新的情况下较为明显。如果将所有的绘图场景不加区分的在每一次刷新时都进行重绘,双缓冲刷新技术是低效的,但是这种状况可以通过引入一个与窗口设备上下文兼容的内存静态设备描述表加入改进。通常情况下,绘图的场景可以划分为静态场景和动态场景,静态场景是指位置和各种图形属性不随时间发生变化的场景,例如一个足球场地;动态场景是指位置或者图形属性随时间发生变化的场景,例如足球场上的足球和运动员。在采用双缓冲技术进行绘图时,可以通过对静态场景进行特殊处理以减少重绘时的任务量,方法是在第一次进行屏幕刷新时将静态场景绘制在一个与窗口设备上下文兼容的内存静态设备描述表中,在以后重绘时则不需要再次重新绘制静态场景而只需要将保存在内存静态设备描述表中的静态场景拷贝到后备缓冲区中,然后再将动态场景直接绘制在后备缓冲区中,最后将整个后备缓冲内容拷贝到前端缓冲区完成整个双缓冲绘图过程。该方法的原理是因为静态场景不会随着时间发生变化,因此不需要每一次刷新时都进行重绘,而只需要在绘图区域的大小发生改变时重绘即可。使用这种方法的额外开销是引入了一个内存静态设备描述表,但是这种开销所换取的效率在内存廉价的今天是微不足道的。b)    效率低下的gidplus    Gdiplus相对于gdi来说功能更为强大,主要表现在gdiplus支持矩阵操作并且gdiplus具有反锯齿的功能,可以绘制出相对平滑的曲线。但是强大的功能通常是需要代价的,gdiplus是直接使用CPU进行绘图,使用gdiplus在开启反锯齿的情况下绘制简单的几条曲线也会导致CPU占用率明显上升,因此通过区分静态场景和动态场景以减少重绘时的CPU工作量在gdiplus绘图过程中具有更加重要的意义。但是不幸的是gdiplus中没有gdi中位拷贝(BitBlt())那样快速高效的内存拷贝函数,相形之下有一个性能极其糟糕的DrawImage()函数。解决的办法是采用gdi和gdiplus混合编程,即采用gdiplus的绘图函数将静态场景绘制到一个与Graphics绘图对象对应的内存静态设备描述表中,然后再使用gdi中的位拷贝方法进行内存拷贝。WGF(windows graphic foundation)为windows下的gdi和gdiplus双缓冲绘图框架。框架在VC6.0下使用C++语言开发而成并以可扩展的MFC动态链接库形式提供,适用于windows操作系统。WGF为完全开源的免费产品,可以用于任何商业的和非商业的用途。WGF设计的目的是对windows下的gdi和gdiplus双缓冲绘图进行封装和优化。WGF封装了使用gdi和gdiplus进行双缓冲绘图的实现细节,使用框架进行双缓冲绘图时感觉就像是在窗口上绘图一样。同时,WGF通过将绘图内容划分为静态场景和动态场景以及通过采用gdi和gdiplus混合绘图的方式对windows下的gdi和gdiplus绘图进行了优化。
以下为采用WGF绘制的二维机器人足球场地:
WGF下载地址及源码:
地址1:http://download.csdn.net/source/565974
地址2:http://cn.ziddu.com/download/214065/WGF.rar.html