GDI和GDI+的应用场合思考
GDI是微软公司的著名的二维图形引擎,GDI+则是微软公司为了提高显示效果而推出的一种新型图形引擎。下面我就我的一些使用经验阐述二者适用的应用场合
GDI基本能满足一般的绘图要求。我觉得GDI最令人诟病的是它画出来的线显示的锯齿实在比较厉害,挑剔的客户会不满意(注:AutoCAD的绘制二维线应该是使用GDI的,它应该是降低了GDI的锯齿程度,不知它是怎么做到的?但依稀还能看到它的锯齿)。另外在复杂的绘图场合GDI确实不能满足要求,如绘制渐变色的线以及渐变色区域。这时GDI+确实是派上用场了,GDI+的表现效果确实比GDI好得多。但是GDI+的交互性不如GDI。比如GDI+不支持GDI的橡皮筋技术(即GDI的绘图模式)。GDI+不支持绘图模式也很好理解,因为GDI+的设计目标应该是为了取得更好的表现效果,如果支持位运算的绘图模式,势必搞得机制非常复杂。
可能有些同学比较藐视橡皮筋:橡皮筋也称得上是技术吗?确实橡皮筋的原理不复杂,但是它在用户交互中作用比较大。网上一些文章鼓吹使用双缓冲代替GDI的橡皮筋,说实话,这个做法小规模绘图或许可以用用,在一般的正规绘图软件中估计不会用,原因是什么?因为一般的正规绘图软件在整个客户区的绘图就是使用双缓冲绘图的,用户交互绘图本来就是一个随机过程,难不成你为每次用户绘图操作都开辟一个客户区大小的缓冲实现双缓冲区绘图?因此,这个实际上这个并不可行。
GDI+也没有自己的双缓存机制,需要GDI的双缓存机制来支撑,具体是构造内存DC来实现。
在图元比较多的时候GDI+的效率也会成问题,特别是开启反锯齿功能的时候。网上有人测试过GDI+在开启反锯齿时比QT开启反锯齿时慢了不少(他的实验是:分别用GDI GDI+ QT绘制宽度为3的线条999条,发现
GDI无抗锯齿:24ms
GDI+无抗锯齿:86ms
GDI+抗锯齿:800ms+
QT抗锯齿:220ms)
因此我觉得比较好的二维绘图组合是:GDI负责交互绘图以及双缓存的实现,GDI+负责复杂显示效果的实现以及没有用户交互的绘图场合(当然在需要考虑绘图效率的绘图场合斟酌使用)。