首页 > 技术文章 > GUI图形图像编程主要技术的学习梳理

chen943354 2019-12-12 15:37 原文

开发实现GUI图形应用程序是编程领域的一个重要部分。本文在参考网文的基础上,记录下自己对这方面的梳理和理解,仅作为学习记录。

Windows平台下有哪些技术可以进行GUI开发?

微软系:GDI、GDI+、Direct2D、Direct3D、DirectX
其它:openGL

GID、GID+是什么?

  • .net framework框架自身自带的相关类库

  • Direct系列和GDI性能最大的差别在于使用GPU还是CPU来计算数据并输出绘制。通常来说,GDI/GDI+火力全开也不能满足全屏平滑滚动,包括帧同步等问题。

  • 其次没有硬件加速,绘制基本上就是基于memory copy的数据搬运。从实现的角度 GDI和GDI+ 和AGG都是软件实现的。原理类似于比如我要在屏幕绘制一个矩形的色块,他的代码就类似于如下代码,因此画面复杂、帧率较高等场景,CPU就可能抗不住。

    for (int i = 0;i < w; ++i)
    for (int j = 0;j < h; ++j)
    {
    bitmap[i][j] = rgba(r,g,b,a);
    }
    
  • 软件渲染有他的优点就是不需要显卡,有比较好兼容性。正是因为软件实现,所以很多软件的兼容行考虑,就时采用GDI来处理。

  • 缺点就是CPU密集型的,比较不容易在渲染的性能上面做出很大的文章。

Direct2D是什么?

  • 功能跟GDI+一样强大,操作跟GDI+一样方便
  • 速度比GDI和GDI+高几个数量级
  • 就是为了解决2D游戏、UI的场景
  • D2D也不是利用GPU硬件计算这么简单的,如下图,gpu只会计算三角形。因此需要CPU将目标图形按照某种算法切换成三角形,再交给GPU处理,但是综合来说也是快。

img

  • D2D也是上层API,需要调用D3D作为底层。

Direct3D是什么?

Direct3D是指具体3D的部分,而DirectX是泛指,包含2d、3d、音频、输入及开发调试工具等一系列;

DirectX是什么?

  • 通常DirectX比GDI帧率高三倍以上;
  • GDI是在内存中绘图,然后再传入显存,最后显示出来。
  • DirectX当初出现,就是为了解决Windows在游戏中绘图太慢专门开发的。Windows不允许直接读写显存,DirectX提供了直接利用显存绘图的API。这样节省了一个步骤,直接就带来三倍的性能提升。

img

  • 在WPF中,底层的图形技术不再是GDI/GDI+,而是DirectX。这意味着不管是设计复杂的三维图形(这是DirectX的特长),还是仅仅绘制几个按钮以及简单的文本,所有的绘图工作都是通过DirectX管线来完成

OpenGL、OpenGLES是什么?

  • 和DirectX等价的东西
  • OpenGL 是 Cross-Platform的,而且是Open Source的
  • 发展趋势:直到DirectX6时代,OpenGL都被认为是比DirectX更加优秀的API,即使那个时候DirectX已经有《CS》《极品飞车5》等大作的支持,却依然不受当时FPS游戏霸主id Software的待见。作为那个时代的显卡杀手,《Quake III》都仅仅只支持OpenGL。DirectX7发布之后DirectX和OpenGL开始逐渐平起平坐。直到2000年DirectX8的发布才使DirectX在游戏领域完全确立了自己的优势

扩展:Linux、macOS系统,Android 、IO的类似组件分别是什么名称?

  • Linux、macOS上支持的是OpenGL
  • 移动端(Android、IOS)也全部是openGL
  • OpenGL ES 在 iOS 12 后被弃用
  • 苹果最新也开发了metal
  • 图形这块的发展是靠用户、游戏厂商的驱动,而Linux和macOS作为相对小众的消费级操作系统平台,在图形图像这方面确实不如Windows

推荐阅读