GDI+

https://docs.microsoft.com/en-us/windows/win32/gdiplus/-gdiplus-gdi-start

Windows GDI +是Windows XP操作系统或Windows Server 2003的子系统,负责在屏幕和打印机上显示信息。GDI +是通过一组C ++类公开的API。

顾名思义,GDI +是Windows图形设备接口(GDI)的继承者,GDI是Windows早期版本附带的图形设备接口。Windows XP或Windows Server 2003支持GDI以与现有应用程序兼容,但是新应用程序的程序员应使用GDI +满足其所有图形需求,因为GDI +优化了许多GDI功能并还提供了其他功能。

图形设备接口(例如GDI +)允许应用程序程序员在屏幕或打印机上显示信息,而不必担心特定显示设备的细节。应用程序程序员对GDI +类提供的方法进行调用,而这些方法又对特定的设备驱动程序进行适当的调用。GDI +使应用程序与图形硬件隔离,正是这种隔离使开发人员可以创建独立于设备的应用程序。

Windows GDI +的服务分为以下三大类:

  • 2D矢量图形
  • 影像学
  • 版式

2D矢量图形
矢量图形涉及绘制由坐标系统上的点集指定的图元(例如直线,曲线和图形)。例如,一条直线可以由其两个端点指定,而矩形可以由一个给出其左上角位置的点以及一个给出其宽度和高度的数字对指定。一个简单的路径可以由一个点阵列指定,这些点可以用直线连接。贝塞尔曲线是由四个控制点指定的复杂曲线。

GDI +提供了一些类,这些类存储有关基元本身的信息,类存储有关如何绘制基元的信息,以及实际进行绘制的类。例如,Rect类存储矩形的位置和大小。所述笔约线条颜色,线条宽度和线条样式类存储的信息; 和图形类有用于绘制线条,矩形,路径和其它附图的方法。还有几种Brush类,用于存储有关如何用颜色或图案填充闭合图形和路径的信息。

影像学
使用矢量图形技术很难或无法显示某些类型的图片。例如,很难将工具栏按钮上的图片和显示为图标的图片指定为直线和曲线的集合。用矢量技术创建拥挤的棒球场的高分辨率数字照片将更加困难。这种类型的图像存储为位图,即代表屏幕上各个点的颜色的数字数组。存储有关位图信息的数据结构往往比矢量图形所需的数据结构更复杂,因此GDI +中有几个专门用于此目的的类。此类的示例是CachedBitmap,它用于将位图存储在内存中以便快速访问和显示。

版式
字体设计涉及各种字体,大小和样式的文本显示。GDI +为这项复杂的任务提供了大量支持。GDI +的新功能之一是亚像素抗锯齿,它使在LCD屏幕上呈现的文本看起来更平滑。

https://docs.microsoft.com/en-us/windows/win32/direct2d/comparing-direct2d-and-gdi
GDI和Direct2D硬件加速
Direct2D和GDI硬件加速之间最重要的区别是驱动它们的基础技术。Direct2D位于顶层Direct3D上,GDI具有其自己的驱动程序模型,即GDI设备驱动程序接口(DDI),它与GDI原语相对应。Direct3D驱动程序模型对应于GPU中的3D渲染硬件。首次定义GDI DDI时,大多数显示加速硬件都以GDI原语为目标。随着时间的流逝,越来越多的重点放在3D游戏加速上,而在应用程序加速上则越来越少。结果,BitBlt API被硬件加速,而大多数其他GDI操作却没有。

这为GDI渲染显示方式的一系列更改奠定了基础。下图显示了GDI显示渲染如何从Windows XP更改为Windows 7。

Windows 7中Direct2D和GDI加速的对比
Direct2D和GDI都是2D立即模式渲染API,并且是硬件加速的。但是,两个API仍然存在许多差异。

资源位置
默认情况下,GDI将其资源(尤其是位图)保留在系统内存中。Direct2D在显示适配器上的视频内存中维护其资源。当GDI需要更新视频存储器时,除非资源已经在光圈存储器段中或者可以直接表示操作,否则必须通过总线来完成。相反,Direct2D可以将其原语简单地转换为Direct3D原语,因为资源已经在视频内存中。

渲染方式
为了保持兼容性,GDI使用CPU将其大部分渲染执行到光圈存储器。相反,Direct2D将其API调用转换为Direct3D原语和绘图操作。然后将结果呈现在GPU上。当光圈存储器复制到代表GDI窗口的视频存储器表面时,一些GDI渲染将在GPU上执行。

可扩展性
Direct2D的渲染调用都是到GPU的独立命令流。每个Direct2D工厂代表一个不同的Direct3D设备。GDI对系统上的所有应用程序使用一个命令流。GDI的方法可能导致GPU和CPU渲染上下文开销的增加。

位置
Direct2D完全在用户模式下运行,包括Direct3D运行时和用户模式Direct3D驱动程序。这有助于防止由于内核中的代码缺陷而导致系统崩溃。但是,GDI在内核模式下的会话空间中具有大部分功能,而在用户模式下则具有API界面。

硬件加速的可用性
GDI在Windows XP上是硬件加速的,而在运行Desktop Window Manager和使用WDDM 1.1驱动程序时,在Windows 7上是加速的。在几乎所有WDDM驱动程序上,无论是否使用DWM,Direct2D均可通过硬件加速。在Vista上,GDI将始终在CPU上呈现。

展示模型
最初设计Windows时,内存不足,无法将每个窗口存储在自己的位图中。结果,GDI始终在逻辑上直接渲染到屏幕,并应用了各种裁剪区域以确保应用程序不会在其窗口之外进行渲染。在Direct2D模型中,应用程序渲染到后台缓冲区,并在完成应用程序绘制后显示结果。这使Direct2D可以比GDI更流畅地处理动画场景。

结论
现有的GDI代码将在Windows 7下继续正常运行。但是,在编写新的图形呈现代码时,应考虑使用Direct2D,因为它可以更好地利用现代GPU的优势。

原文地址:https://www.cnblogs.com/feipeng8848/p/13217568.html