读书人

年关散分:GDI+性能到底怎么能否取代

发布时间: 2012-01-11 22:28:46 作者: rapoo

年关散分:GDI+性能到底如何,能否取代GDI
RT

[解决办法]
sf,JF

[解决办法]
GDI+性能总的来说比GDI好,对于一些复杂的图形图像的处理的时间减少不少;但是,对于简单的处理,比如画一个像素,好像还没有GDI快,具体记不得了;
不建议取代,还是一起用的好!
[解决办法]
春节快乐
[解决办法]
一、GDI
  GDI是位于应用程序与不同硬件之间的中间层,这种结构让程序员从直接处理不同硬件的工作中解放出来,把硬件间的差异交给了GDI处理。GDI通过将应用程序与不同输出设备特性相隔离,使Windows应用程序能够毫无障碍地在Windows支持的任何图形输出设备上运行。例如,我们可以在不改变程序的前提下,让能在Epson点式打印机上工作的程序也能在激光打印机上工作。它把windows系统中的图形输出转换成硬件命令然后发送给硬件设备。GDI是以文件的形式存储在系统中,系统需要输出图形时把它载入内存,如果转换成硬件命令时遇到非GDI命令,系统还可能载入硬件驱动程序,驱动程序辅助GDI把图形命令转换成硬件命令。



二、设备环境
  Windows系统是用来给应用程序提供设备独立性的工具,它是windows系统为了处理输出设备而使用的一种内部数据结构,设备环境是windos程序,驱动程序,和输出设备(如打印机,绘图仪)之间的纽带,GDI是一组C++类,它在驱动程序的协助下把数据描绘在硬件上,它位于应用程序与硬件之间,把数据从一方传到另一方。在Visual Studio .NET中Micro$oft解决了GDI中的许多问题,并让它变得易用,GDI的.net版本叫做GDI+。

三、GDI+
  GDI+是GDI的下一个版本,它进行了很好的改进,并且易用性更好。GDI的一个好处就是你不必知道任何关于数据怎样在设备上渲染的细节,GDI+更好的实现了这个优点,也就是说,GDI是一个中低层API,你还可能要知道设备,而GDI+是一个高层的API,你不必知道设备。例如你如果要设置某个控件的前景和背景色,只需设置BackColor和ForeColor属性。

四、编程模式的变化
“GDI uses a stateful model, whereas GDI+ uses a stateless”——GDI是有状态的,GDI+是无无状态的。

1、不再使用设备环境或句柄
  在使用GDI绘图时,必须要指定一个设备环境(DC),用来将某个窗口或设备与设备环境类的句柄指针关联起来,所有的绘图操作都与该句柄有关。而GDI+不再使用这个设备环境或句柄,取而代之是使用Graphics对象。与设备环境相类似,Graphics对象也是将屏幕的某一个窗口与之相关联,并包含绘图操作所需要的相关属性。但是,只有这个Graphics对象与设备环境句柄还存在着联系,其余的如Pen、Brush、Image和Font等对象均不再使用设备环境。

2、Pen、Brush,Font,Image等对象是图形对象独立的
  画笔对象能与用于提供绘制方法的图形对象分开创建于维护,Graphics绘图方法直接将Pen对象作为自己的参数,从而避免了在GDI使用SelectObject进行繁琐的切换,类似的还有Brush、Path、Image和Font等。

3、“当前位置”
  GDI绘图操作(如画线)中总存在一个被称为"当前位置"的特殊位置。每次画线都是以此当前位置为起始点,画线操作结束之后,直线的结束点位置又成为了当前位置。设置当前位置的理由是为了提高画线操作的效率,因为在一些场合下,总是一条直线连着另一条直线,首尾相接。有了当前位置的自动更新,就可避免每次画线时都要给出两点的坐标。尽管有其必要性,但是单独绘制一条直线的场合总是比较多的,因此GDI+取消这个"当前位置"以避免当无法确定"当前位置"时所造成的绘图的差错,取而代之的是直接在DrawLine中指定直线起止点的坐标。   

4、绘制和填充
  GDI总是让形状轮廓绘制和填充使用同一个绘图函数,例如Rectangle。轮廓绘制需要一个画笔,而填充一个区域需要一个画刷。也就是说,不管我们是否需要填充所绘制的形状,我们都需要指定一个画刷,否则GDI采用默认的画刷进行填充。这种方式确实给我们带来了许多不便,现在GDI+将形状轮廓绘制和填充操作分开而采用不同的方法,例如DrawRectangle和FillRectangle分别用来绘制和填充一个矩形。   

5、区域的操作
  GDI提供了许多区域创建函数,如:CreateRectRgn、CreateEllpticRgn、CreateRoundRectRgn、CreatePolygonRgn和CreatePolyPolygonRgn等。诚然,这些函数给我们带来了许多方便。但在GDI+中,由于为了便于将区域引入矩阵变换操作,GDI+简化一般区域创建的方法,而将更复杂的区域创建交由Path接管。由于Path对象是与设备环境分离开来的,因而可以直接在Region构造函数中加以指定。

五、GDI+新特色
GDI+与GDI相比,增加了下列新的特性:

1、渐变画刷
  以往GDI实现颜色渐变区域的方法是通过使用不同颜色的线条来填充一个裁剪区域而达到的。现在GDI+拓展了GDI功能,提供线型渐变和路径渐变画刷来填充一个图形、路径和区域,甚至也可用来绘制直线、曲线等。这里的路径可以视为由各种绘图函数产生的轨迹。   

2、样条曲线
  对于曲线而言,最具实际意义的莫过于样条曲线。样条曲线是在生产实践的基础上产生和发展起来的。模线间的设计人员在绘制模线时,先按给定的数据将型值点准确地"点"到图板上。然后,采用一种称为"样条"的工具(一根富有弹性的有机玻璃条或木条),用压铁强迫它通过这些型值点,再适当调整这些压铁,让样条的形态发生变化,直至取得合适的形状,才沿着样条画出所需的曲线。如果我们把样条看成弹性细梁,那么压铁就可看成作用在这梁上的某些点上的集中力。GDI+的Graphics:: DrawCurve函数中就有一个这样的参数用来调整集中力的大小。除了样条曲线外,GDI+还支持原来GDI中的Bezier曲线。

3、独立的路径对象
  在GDI中,路径是隶属于一个设备环境(上下文),也就是说一旦设备环境指针超过它的有效期,路径也会被删除。而GDI+是使用Graphics对象来进行绘图操作,并将路径操作从Graphics对象分离出来,提供一个GraphicsPath类供用户使用。这就是说,我们不必担心路径对象会受到Graphics对象操作的影响,从而可以使用同一个路径对象进行多次的路径绘制操作。

4、矩阵和矩阵变换
  在图形处理过程中常需要对其几何信息进行变换以便产生复杂的新图形,矩阵是这种图形几何变换最常用的方法。为了满足人们对图形变换的需求,GDI+提供了功能强大的Matrix类来实现矩阵的旋转、错切、平移、比例等变换操作,并且GDI+还支持Graphics图形和区域(Region)的矩阵变换。

5、Alpha通道合成运算
  在图像处理中,Alpha用来衡量一个像素或图像的透明度。在非压缩的32位RGB图像中,每个像素是由四个部分组成:一个Alpha通道和三个颜色分量(R、G和B)。当Alpha值为0时,该像素是完全透明的,而当Alpha值为255时,则该像素是完全不透明。   
  Alpha混色是将源像素和背景像素的颜色进行混合,最终显示的颜色取决于其RGB颜色分量和Alpha值。它们之间的关系可用下列公式来表示
  显示颜色 = 源像素颜色 X alpha / 255 + 背景颜色 X (255 - alpha) / 255
GDI+的Color类定义了ARGB颜色数据类型,从而可以通过调整Alpha值来改变线条、图像等与背景色混合后的实际效果。

6、多图片格式的支持


  GDI+提供了对各种图片的打开,存储功能。通过GDI+,我们能够直接将一幅BMP文件存储成JPG或其它格式的图片文件。
  除了上述新特性外,GDI+还将支持重新着色、色彩修正、消除走样、元数据以及Graphics容器等特性。
[解决办法]
JF
[解决办法]
GDI+本来就不是以性能作为优点,想要更好的性能的话如果GDI+不满足要求,那GDI同样也不满足。
[解决办法]
4楼的好详细;
学习,接分;
顺祝春节快乐
[解决办法]
以前用过GDI+,觉得速度方面不快,比GDI慢,但是对于很多显示方面的代码都不用自己写了,如图片拉伸后的清晰显示,就不用写双线性插值的代码了,旋转也一样,而且对多种图片格式打开和保存的支持也很有用,帮助很多,对于这些需求可以使用GDI+。
[解决办法]
从原理上来说效率肯定不如gdi的
但是从功能上肯定比后者强
[解决办法]
GDI+ 方便容易,支持很多GDI不支持的东西。
GDI 速度快
[解决办法]
学习
jf
[解决办法]
GDI+本身就是为了弥补GDI在绘图能力上的不足而出现的一个可选扩展库,由于扩充了大量的新特性和新图片格式,在性能上明显不如GDI。但这只是现状,不是未来,未来的GDI+将着重优化性能,会加入类似DX的硬件加速优化。
[解决办法]
期待更好更快的GDI+出现。


[解决办法]
学习了
[解决办法]
学习了
[解决办法]
各有各的好外,如果还要依赖特定平台的话,不如现在有着gdi算了。
[解决办法]
up
[解决办法]
来凑个热闹,呵呵,转个我以前写的,是用c++/cli做的测试,图就没法传了,完整版去这里看
http://user.qzone.qq.com/370838425

万万没有想到在华丽无比的.net下显示一屏幕的文字居然耗时200ms以上!就是说每秒帧数只有5帧!我玩上古卷轴4都没这么卡过,神啊,我只是显示一点文字,至于么?
地狱般的两天于是开始。通过对Windows的文字输出反复测试,结果如下:



不幸的是.net的GDI+库输出文字函数只有DrawString,更不幸的是这个函数沿用了SDK GDI的DrawText,一个非常低效的文字输出函数。显示“我每天爱你得发烧”1000次耗时163ms,我要掐死微软的程序员!
最快的是用GDI函数TextOut,显示点阵字体以不透明方式,1000次只用了11ms,足足快了15倍!可是……点阵字体好难看啊,怎么办?不要问我了,问猫咪去。
顺带测试了下简单的画线,画1000条竖线的结果如下:


GDI画线用了2.5ms,GDI+用了12.2ms,慢了5倍。
图像就不说了,获得GDI+ Bitmap的HBITMAP比画图整个过程耗费的时间还多,动态绘制根本就不可能。
泪奔


结论就是密集的绘图还是用gdi比较好,我做的报表主要部分就全是用gdi函数做的,至于画画按钮这种负荷不重的绘图,gdi+就能胜任了。
[解决办法]
4楼真详细,学习了。。
顶上去。
[解决办法]
JF

[解决办法]
GDI+功能更强,但性能不如GDI
[解决办法]
up

[解决办法]
恩,以前用过GDI+

我对速度方面没啥追求,所以感觉还是蛮实用的。

不过发现一个问题,我在透明窗体上用GDI+绘图时,那些荧光笔的效果(透明的笔画)就不能够实现了。

不知道怎么解决。

[解决办法]
学习了
[解决办法]
帮顶~
[解决办法]
GDI+ 可以简单的理解为 GDI与基本算法的集合
一些图像上 绘图上的效果 如果用GDI来做的话 需要自己去找算法(曲线计算和图像处理算法等)
而GDI+帮助我们做了很多的算法部分 开发过程可以节省很多时间
速度上也没有问题
如果说有问题的话,那就是因为GDI+使用了增强效果了
比如 同样画一条线 GDI+可能使用了反锯齿等算法 而GDI没有 所以才显得慢



另外GDI+对资源的回收弄的比较好 所以使用的时候一般不用再过多的考虑资源没有释放或者资源泄露的问题。
[解决办法]
我用着还是gdi比较好
[解决办法]
实现简单的绘制用gdi就好了。复杂的就用gdi+
[解决办法]
并没有太大的差别
[解决办法]
4楼真详细,真不错
[解决办法]
期待GDI+....
[解决办法]
kk
[解决办法]
up~!
[解决办法]
性能没有提高,但是功能有所增强。举个最简单的例子就是 GDI+有反锯齿功能,而GDI没有。
[解决办法]
目前GDI+的速度慢于GDI,以后可能会快。
[解决办法]
JF-
[解决办法]
gdi+封装了更多东西,所以cpu跑了更多程序,有的自然比gdi慢了。
至于取代,跟着ms走就行了,如果你做windows程序员的话。
[解决办法]
肯定比gdi慢了,不过人家强大哈
[解决办法]
无论gdi还是gdi+性能和功能都不是最佳的,网上有很多别的库,比如intel 的ipl及OpenCV,agg等等,这些库的功能和效率都比较强的。
[解决办法]
gdi 和gdi+同样都无法避免在用户层和核心层之间的切换
只是在某些算法上做了一些优化
要是做复杂一些的图形处理肯定无法满足性能的要求
[解决办法]
UP!学习了!

读书人网 >VC/MFC

热点推荐