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