大家好,小弟初学windows图形编程,对于gdi和directx有些疑问,哪位兄弟知道的话麻烦告知以下,在这里先谢过各位啦我的疑问在于:
    
    directx的出现是为了改善gdi绘图的缓慢,那就是说directx能有效提高图形的绘制输出。问题来了:windows NT 4.0后将gdi实现部分移入内核中,也就是说在应用程序无感知的情况下提升了很多gdi效率,那为什么directx不能如法炮制呢?他完全可以在应用程序没有感知的情况下优化gdi,在内核态将gdi的绘制交给directx,这样,gdi的效率不是又得到很大的提升吗?而且还不用单独发布一套com接口,还要增加程序员的学习成本?    麻烦各位不吝赐教,大家广开言路,知道啥就说啥就可以啦,哈哈

解决方案 »

  1.   

    妈的,回复了一大堆,结果提交不了,页面一刷新,写的内容全没了。只能回答一句:GDI和DX是两个完全不相容的框架,不可能统一,这是硬件特性使然。
      

  2.   

    麻烦楼上说的详细一点啊,不胜感激啊,我在这个问题上困扰好久了,查阅了好多资料有讲dx的,有讲gdi的,但是很少有将两者拿来比较的,恳求楼上说的详细点啊,再次谢过了我一般提交之前先复制的,然后才敢点提交按钮,哈哈
      

  3.   

    查阅了好多资料有讲dx的,有讲gdi的,但是很少有将两者拿来比较的因为没法比,DX直接读写显存的,GDI玩内存的。效率玩爆GDI
      

  4.   

    我就辛苦点,再敲一次吧。GDI和DX在原理和框架设计上是完全不同的,有几个重要的方面决定了它们是没法结合。
    1.现代的2D库(包括GDI)都基于画布来操作,或者叫位图区域,而3D库的操作对象只是场景和3D物体,没有画布概念,你在显示器上看到的只是渲染流水线中的最后一个环节(光栅化)而已。
    2.计算单元的设计理念不同。CPU是通用指令,能干所有事,包括3D运算,只是效率低而已;GPU只有有限的专用指令,它的目的是通过并行方式执行大量的重复运算,且浮点运算是强项,在像素运算效率上比CPU高几个数量级,但它并不通用。
    3.动态计算。2D运算中有大量的文字字型生成、图像特效计算过程,这些动态计算只能由CPU承担,硬件能加速的部分只局限于图像的混合,换句话说,只有静态图像数据才能硬件加速。MMX指令虽然能起到加速作用,但性能提升幅度相比GPU来说简直不值一提。
    4.内存。GPU运算只能在显存中进行,CPU运算只能在系统内存中进行,当两种内存的数据需要互相传输时,内存间的IO次数和传输量必须严格控制,过大的数据吞吐将严重影响硬件加速性能。对于3D应用来说,CPU的功能通常是构造并传递流水线指令、加载各种静态图片(纹理)、响应键盘鼠标游戏外设消息,这里面数据吞吐量最大的就是图片,游戏中通常在关口开始阶段就把所有纹理一次性加载到显存,而且在运行过程中很少或者几乎没有动态计算过程(比如文字处理)。从上面可以看出,GDI/DX的差别到底有多大,为什么UI系统和游戏很少被融合,因为需求不同,尤其是第三点,UI中需要大量的动态计算,游戏恰好相反,必须尽可能减少动态计算。不是想融合就能融合的。暂时就说这么多吧。
      

  5.   

    感谢大牛的回答,真的是受益匪浅,在此谢过啦根据上面的回答,我总结下:    从总体上来说,dx和gdi设计的出发点不同,dx主要是为gpu来设计的,他需要强烈的硬件支持,并且,它非常针对游戏设计,因为游戏和普通的2d客户端对于CPU来说的计算量差异很大,所以,游戏一方面需要硬件支持,另外又符合某种(如显卡)所擅长的计算模式;而gdi是为广谱设计的,2d客户端可以用,游戏也可用,只不过游戏运行起来会很卡,因为cpu不适应游戏场景这种计算,gdi没有充分利用gpu,于是有了dx。    dx需要相应的软件和硬件来支持,否则不能运行,而gdi则兼容绝大部分硬件,我所知道的还没有不支持gdi操作的,即使是没有安装显卡驱动,一样可以输出图形,这可以在未安装显卡驱动的显示器上看到;    dx在用户模式下分解绘图操作,从而直接交给gpu去绘制,这样,gpu不能踢回(踢回见windows图形编程一书第二章)dx传过来的绘制操作,因为事前已经确定好显卡驱动可以做哪些绘制了;而gdi则是以商量的形式和显卡驱动交互,显卡驱动在繁忙的时候可以踢回gre(同见windows图形编程)发送的请求,有gre来分解gdi绘图操作。    最后,就目前来说,gdi的一些底层实现,已经慢慢转向dx来加速了,所以二者的交集也在越来越大。好的,就这些了,3天后结贴,如果有哪位仁兄还有补充,非常欢迎!!