图形编程可以说是整个游戏开发过程中最重要的一个环节,因为游戏中最直接面对用户的就是游戏画面,而游戏中渲染画面的效果也是玩家选择游戏最重要的砝码之一。

在 Windows 平台中,用来渲染画面的图形接口有很多,包括 GDI、GDI+、Direct2D、Direct3D、OpenGL 等等,这些接口的关系如下图所示:

图形接口

  • 图形设备接口(GDI)是一套非常原始的图形接口,首次出现是在 Windows 16 位操作系统上,现在的32位或者64位的操作系统上一样可以使用。

  • GDI+ 是在 Windows XP 开始引入的,是GDI的继承者。GDI+ 库本身是一套 C++ 类的集合,在内部包装了 C 接口。在 .NET 框架中也提供了一套,命名空间为 System.Drawing。

  • Direct3D 支持 3D 图形的绘制。

  • Direct2D 是一套 2D 图形绘制 API,用来替代 GDI 和 GDI+。

  • DirectWrite 是主要用来文本布局和光栅化的文字引擎,你可以使用 GDI 或者 Direct2D 来绘制光栅文字。

  • DirectX 图形基础设施(DXGI)是一套执行底层任务的接口,例如输出帧图像等操作。大多数的情况下应用程序不会直接调用 DXGI 接口,它主要充当 Direct3D 和图形驱动的中间层。

Direct2D 和 DirectWrite 是从 Windows 7 开始引入的。它们也可以运行在 Vista 或 Server2008 操作系统上,不过需要做安装一些 补丁包

在咱们2D游戏开发教程中,对于图形接口的选择并没有什么强制要求,因为这些游戏本身并不是什么大型的3D游戏,也没有特别复杂的场景,所以 GDI、Direct2D、Direct3D 都是可以接收的,不过这里推荐大家使用 Direct2D。

下面简单介绍一下 Direct2D 相对于其它传统 2D 图形接口的优点:

1. 支持硬件加速

硬件加速(hardware acceleration)这个概念的含义是涉及图形计算展示相关的操作在图形处理单元(GPU)中处理,而不是 CPU。现代 GPU 对于图形的显示和计算做了高度优化,一般来说,从 CPU 转移到 GPU 上的工作量越多越好。

虽然 GDI 在某些操作上也支持硬件加速,但是大多数的接口仍然工作在 CPU 上。Direct2D 的实现是基于 Direct3D 的,所以可以充分的利用 GPU 的相关资源。如果 GPU 不支持 Direct2D 所涉及的相关特性,那么 Direct2D 会自动降级为软渲染。总体来说,Direct2D 在大多数的情况下都是优于 GDI 和 GDI+ 的。

2. 支持透明度和抗锯齿

Direct2D 中 alpha 混合(alpha-blending)操作支持硬件加速。GDI 对 alpha 混合支持有限。尽管 GDI 在 bitblt 操作上支持 alpha 混合操作,但是其它大多数接口都是不支持的。而 GDI+ 虽然支持透明特性,但是此操作并不支持硬件加速,只能在 CPU 执行。

硬件加速 alpha 混合也支持反走样(抗锯齿)(anti-aliasing),“走样” 是通过连续不断的采样函数引起的现象。例如,当一条曲线转换为像素,“走样” 操作会导致显示出的图像含有锯齿的形状。任何减少这种锯齿的现象被称为 “反走样”。在图形中,反走样是通过图像边缘和背景颜色混合完成的。下面是用 GDI 和 Direct2D 绘制的两个大小一样的两个圆:

抗锯齿

放大图像的细节:

抗锯齿细节

左侧的圆是由 GDI 绘制而成,它通过一些黑色的像素来绘制一个近似的圆形。右侧使用 Direct2D 绘制而成,它使用了反走样技术使曲线更加平滑。

GDI 在绘制几何体(线和曲线)的时候是不支持反走样的,但是可以使用 ClearType 绘制反走样文本。GDI 文本支持反走样,因为反走样技术在文本中的改善极其明显,走样会破坏文本的轮廓,降低文本的可读性。虽然 GDI+ 也支持反走样,但是它使用 CPU 而不是 GPU,所以使用 Direct2D 替换二者是一个不错的选择。

3. 支持矢量图形

Direct2D 支持矢量图形。在矢量图中,数学公式用来表示直线和曲线。这些公式不依赖于屏幕的分辨率,所以它们可以缩放到任意维度。当图像被用来适配多种不同屏幕的时候,这种技术特别有用。