DirectX
| Microsoft Windows 的组件 | |
Current DirectX logo | |
| 推出于 | Windows 95 |
|---|---|
Microsoft DirectX 是基于 COM 的 API 集合,用于在 Microsoft 平台上处理与多媒体相关的任务,特别是游戏编程和视频。
最初,所有 API 的名称(Direct3D、DirectDraw 等)都以“Direct”开头,因此 DirectX 名称是作为所有这些 API 的简写术语创造的(X 代表特定 API 名称),并很快成为集合的正式名称。
WinG 和 DCI
为 Windows 带来快速视频性能的第一次真正尝试是在虚拟平面帧缓冲设备(也称为 VFLATD[1] 或 DVA.386 —— 直接视频访问,Direct Video Access)中,此设备作为 Video for Windows(VfW)的一部分提供,使 DrawDib 函数能够绕过 GDI 并将解压缩的视频帧直接写入 VRAM。虽然它对可以支持的帧缓冲区大小有一些限制,但它确实通过使用页面错误处理程序来模拟 banked 显示适配器上的线性帧缓冲区,从而允许更快的帧缓冲区访问。VfW 还支持 DISPDIB.DLL,它支持关闭 GDI 以允许程序直接写入 VGA 帧缓冲区(KERNEL.EXE 导出了 A0000h 的选择器)。在 Windows NT 上,VfW 使用 DIB 部分或 DCI 绘制到屏幕上,而 DISPDIB 实际上是在 DrawDib 之上实现的。
Windows NT 3.5 添加了对 GDI 的 CreateDIBSection API 调用,它允许在用户可访问的内存中创建由设备独立位图支持的 HBITMAP(在此之前,使用 GDI 显示 DIB 的唯一方法是通过 API 调用(如 SetDIBits),它将 DIB 转换为 DDB,这是一个缓慢的过程),因此具有一个选择了 DIB 的设备上下文。因此,既可以使用 GDI 调用在 DIB 上绘图,也可以使用 BitBlt 等快速函数将 DIB 绘制到屏幕上。命名 API 的原因是 Windows NT 将内存对象称为节,实际上,你可以通过传递节句柄来围绕现有内存创建 DIB 节;否则,GDI(实际上是 CSRSS;客户端-服务器运行时子系统,Client-Server Runtime Subsystem)将为你创建一个。DIB 部分位于应用程序和 GDI(以及显示驱动程序及其映射内存)所在的子系统服务器之间的共享内存中。
Windows 95(当时称为“Chicago”)也添加了此 API 调用,并引入了 DIB 引擎(在 1992 年的 Chicago 规范中首次详细介绍了与 DIB DC 相关的 API 调用,并早在 1992 年 7 月实施)。DIB 引擎旨在简化 Windows 95 显示驱动程序的开发,允许视频卡供应商简单地提供一个“微型驱动程序”,此驱动程序提供设置视频模式的代码并提供指向帧缓冲区的指针,而 DIB 引擎将处理其他所有事情。DIB 引擎针对打包像素 8/16/24/32 位帧缓冲排列进行了优化,因为这些帧缓冲与 Windows DIB 的格式相同(而许多以前的卡具有不寻常的帧缓冲排列,包括多平面图形)。
DIB 引擎允许 GDI 将整个屏幕视为一个大的 GDI 位图 —— 一个大的 DIB(并允许应用程序和 GDI 访问相同的位图),并且许多驱动程序(特别是那些用于倾斜 SVGA 适配器的驱动程序)使用 VFLATD 来实现此目的,但许多驱动程序也使用 DCI 或显示控制接口,这也是 VfW 技术浪潮的一部分。DCI 在 VFLATD 的基础上进行了扩展,允许支持多个屏幕外表面和大小超过 1MB 的帧缓冲区。DCI 主要为数字视频而设计,因此支持 YUV 等色彩空间以及视频解压缩和拉伸的加速。DCI 受到 Apple 法律诉讼的阻碍,Apple 声称 DCI 中使用的代码是由第三方公司为他们开发的,目的是为了加快 QuickTime for Windows 的视频性能,同一家公司后来与英特尔签订了合同。
DCI 是通过显示驱动程序(包括 DVA.386 和 DCISVGA.DRV)实现的)实现“DCI 提供程序”,此提供程序通过消息传递与 DCI 管理器(DCIMAN.DLL / DCIMAN32.DLL)客户端 DLL 进行通信。在大多数情况下,DCI 客户端是 WinG 或 Video for Windows 等库,但应用程序可以直接调用 DCI 管理器以打开 DCI 提供程序并访问帧缓冲区。
WinG 是 Chicago DIB 引擎早期版本到 Windows 3.1x 的端口,它的大部分功能与 Windows 95 / NT 3.5 中添加的 GDI 调用相似。在 Windows 3.1 上,WinGDC 与 HDC 不同,WinGBitmap 与 HBITMAP 不同,WinGBitBlt/WinGStretchBlt 与 BitBlt/StretchBlt 也是如此,因为 WinG 使用自己的视频路径,尽管通过 WINGDIB.DRV 挂接到 GDI,但在 NT 3.50 / 95 上,它们是可以互换的。这对你可以在 Windows 3.1 上使用 WinG 执行的操作施加了一些限制;标准 GDI BitBlt 函数无法在 WinG DC 和 GDI DC 之间进行 blit,DIB 引擎(WINGDE.DLL)充当 GDI 驱动程序,以允许对 WinGDC 执行标准 GDI 操作。同时,必须使用 WinG 从 WinGDC(上面选择了 DIB)到 GDI(显示/屏幕)DC,因为 WinG 将获取指向 GDI DC 帧缓冲区的指针并绘制到它上面,或者在需要时回退到 StretchDIBits。
许多早期的 Windows 95 游戏(如 WinDoom 和 Fury 3)都使用 WinG(通常与 Win32s 结合使用),但很快就停止了使用,取而代之的是 DirectDraw。使用 WinG 加速的一个著名应用程序是 Microsoft Bob。
Microsoft 确实将 DCI 移植到 32 位 Windows,包括 Windows NT 3.51(在有限程度上),DCI 2.0 演变为 DirectDraw(DirectDraw 实际上将自己称为 DCI 2.0,具有屏幕内外主表面概念的 API 是相同的,DirectDraw 设计团队从 DCI 开始),DCI API 被归入 DirectX(它使用基于 COM 的接口,而不是基于 C 的 API), 共享一些结构、枚举、错误代码和返回值。当 DirectDraw 驱动程序在 Windows 9x 操作系统上不可用时,如果通过硬件仿真层可用,它可以回退到使用DCI(然后它将回退到 DIB 引擎作为最后的手段)。此外,OPENGL32.DLL(适用于 Windows 的软件 OpenGL 1.1 渲染器)使用 DCI 绘制到屏幕上,就像 GDI+ 的原始版本一样,因为相同的可再发行 DLL 文件不仅必须能够在 NT 系统上工作,而且在 9x 系列中也必须能够工作,其中可以安装不支持 DirectDraw 的非常旧的驱动程序。在 Windows 9x 上,DirectDraw 还将使用 DISPDIB.DLL 在任何 VGA 兼容模式(即 320×200×256 模式 13h 或 320×240×256 模式 X)下绘制全屏图形。
从 Windows NT 4.0 开始,Microsoft 开始从操作系统中剥离 DCI 支持,从 GDI32.DLL 中删除了几个与 DCI 相关的导出,从显示驱动程序中删除了对 DCI 的支持,并在 DirectDraw 和 GDI 之上重新实现了 DCI 管理器 API。原因很简单;NT 4.0 的视频体系结构经过重新设计,将 GDI 和 USER(以及新的 DirectDraw,它在 NT 4.0 的开发开始后不久就开始在 NT 上工作)的大部分移动到内核模式模块 WIN32K.SYS,这意味着直接实现 DCI 的 NT 3.x 显示驱动程序将不兼容,因此可以彻底中断以取代 DCI。多个 DCI 函数紧密映射到 DirectDraw 等效项,例如在 IDirectDrawSurface_Lock 之上实现的 DCIBeginAccess,以及映射到 IDirectDraw_CreateSurface 的 DCICreatePrimary。DCI 图面作为 DirectDraw 图面的精简包装器实现,但 API 被严重剥离,仅支持单个图面。同时,Windows 95/98/Me 继续作为 DirectDraw 的对等体对 DCI 提供完全的本机支持,因为 DCI 显示驱动程序仍然受支持。尽管缺少较低级别的组件,但 Vestigial DCI Manager 支持仍保留在现代版本的 Windows NT 中。DirectDraw 开发始于 1994 年(在早期的 WinG 测试版之后),用于 Windows 95,作为使 Windows 上的图形性能与 DOS 相媲美的第一次认真努力,使游戏能够转移到 Windows。
Windows 95 之后,Windows 相关技术和 WinG 作为操作系统的带外更新的视频开发没有继续,此时它们作为核心组件集成到操作系统中。
组件
DirectX 由多个 API 组成,[2]最常见的 API 如下:
- Direct3D(D3D):实时 3D 渲染 API。
- Direct2D:当前的 2D 图形 API。
- DirectDraw:已弃用的 2D 图形 API。
- DirectSound:已弃用的音频 API(替换为 XAudio2 和 XACT3)。
- DirectX Diagnostics(DxDiag):用于诊断和生成与 DirectX 相关的组件(如音频、视频和输入驱动程序)报告的工具。
- DirectX Media 用于音频/视频加速(已弃用)。
- DirectWrite,一种文本呈现 API。
- DirectInput,用于与键盘、鼠标、游戏杆和游戏控制器交互的输入 API(已弃用)。
- DirectPlay,一种用于通过局域网或广域网进行通信的网络 API(已弃用)。
- DirectX Ray Tracing(DXR):光线追踪 API。
- DirectShow:旨在替换 Video for Windows 的流媒体技术,最初称为 ActiveMovie(已弃用)
版本
DirectX 4 从未发布过。Microsoft 的 Raymond Chen 解释说,在 DirectX 3 发布后,Microsoft 开始并行开发版本 4 和 5。版本 4 计划为带有微小更改的短期支持版本,而版本 5 将是一个更大的版本。由于游戏开发人员对 DirectX 4 功能缺乏兴趣,它很快就被取消了,且已经区分了两个新版本的大量文档导致 Microsoft 选择不重用版本 4 来描述版本 5 的功能。[3]
- DirectX 1(1995 年第 4 季度;Windows 95 RTM 附带 1.0)
- DirectX 2(1996 年第 2 季度;Windows NT 4.0 和 Windows 95 OSR2 附带 2.0a)
- DirectX 3(1996 年第 3 季度;Windows NT 4.0 SP3 附带 3.0a;Windows NT 4.0 的最新版本)
- DirectX 5(1997 年第 3 季度;Windows 98 附带 5.2)
- DirectX 6(1998 年第 3 季度;Windows 98 第二版 附带 6.1a)
- DirectX 7(1999 年第 4 季度;Windows 2000 附带 7.0 并引入了对硬件 T&L 的支持;Windows Me 附带 7.1;具有 486 处理器的 PC 的最新版本和具有内置 RGB 软件渲染支持的最新版本)
- DirectX 8(2000 年第 4 季度;增加了对着色器的支持;8.0a 随 Windows 95 OSR2.5 的 2001 年 8 月更新提供;8.1 随 Windows XP 和 Windows Server 2003 提供;Windows 95 的最新版本以及在 DxDiag 中提供软件渲染支持的最新版本)
- DirectX 9(2002 年第 4 季度;9.0b 随 2004 年 2 月起随 Windows 98 Build 1998A、Windows 98 第二版 Build 2222B 和 Windows Me Build 3000A 的 Windows 安全更新光盘提供;9.0c 随 Windows XP SP2、Windows Server 2003 SP1 和 R2 提供;Vista 和 Server 2008 以下所有 Windows 版本的最新版本;Windows 98 和 Windows Me 支持在 2006 年 12 月修订版后已删除)
- DirectX 10(2006 年第 4 季度;10.0 与 Windows Vista 和 Windows Server 2008 一起推出)
- DirectX 11(2009 年第 4 季度;11.0 与 Windows 7 和 Windows Server 2008 R2 一起推出,然后通过平台更新向后移植到 Windows Vista 和 Windows Server 2008;Windows Vista 和 Server 2008 的最新版本;11.1 与 Windows 8 和 Windows Server 2012 一起引入,并通过平台更新部分向后移植到 Windows 7 和 Windows Server 2008 R2;11.2 与 Windows 8.1 和 Windows Server 2012 R2 一起引入)
- DirectX 12(2015 年第 3 季度;12.0 与 Windows 10 和 Windows Server 2016 一起推出,随后在 2020 年推出 DX12 Ultimate,随 Windows 11 一起提供)
图库
-
安装程序(9.0c,2010 年 6 月)
-
Windows XP 中的诊断工具
-
Windows 7 中的诊断工具
-
DirectX 5 ViewPoint Collection 发行说明,提及取消 DirectX 4