Windows 高级光栅化平台 (WARP) 指南
本文介绍 WINDOWS 高级光栅化平台 (WARP) 以及 WARP 的以下方面。
什么是 WARP?
WARP 是一种高速、完全一致的软件光栅器。 它是 Direct3D 11 运行时引入的 DirectX 图形技术的一个组件。 Direct3D 11 运行时通过 [KB971644] 更新安装在 Windows 7、Windows Server 2008 R2 和 Windows Vista 上。 Windows 8、Windows 10和上述Windows Server 2012&,Windows RT包括 Direct3D 11.1 运行时,该运行时具有 WARP 的更新版本。 Windows 10 Fall Creators Update (1709) 包括支持 Direct3D 11 和 Direct3D 12 运行时的 WARP 版本。
WARP 权益
WARP 提供以下优势:
消除对自定义软件光栅器的需求
WARP 简化了开发,无需生成自定义软件光栅器并针对该应用程序进行优化,而无需针对硬件优化应用程序。 通过提供单一的通用软件光栅器,不再需要以多种方式编写图像呈现算法,即可在具有不同特性和功能的硬件或软件上运行。 仍可以通过多种方式实现算法,以实现更好的性能或缩放;但是,无需更改用于实现这些算法的 API 或呈现体系结构。 相反,你可以专注于创建一个出色的 Direct3D 10 或更高版本应用程序,该应用程序看起来相同,在硬件或软件上表现良好。
从图形硬件启用最佳性能
将应用程序优化为在硬件上高效运行时,它也将在 WARP 上高效运行。 反之亦然:任何经过优化以在 WARP 上运行良好的应用程序都将在硬件上表现良好。 使用 Direct3D 10 及更高版本效率低下的应用程序可能无法在不同的硬件上高效缩放。 WARP 的性能配置文件与硬件类似,因此针对大批优化应用程序、最大程度地减少状态更改、删除同步点或锁将同时有利于硬件和 WARP。
当 Direct3D 硬件不可用时启用呈现
WARP 允许在硬件实现不可取或不可用的各种情况下快速呈现,包括:
- 当用户没有任何支持 Direct3D 的硬件时
- 应用程序作为服务或在服务器环境中运行时
- 当应用程序想要保留 Direct3D 硬件资源用于其他用途时
- 未安装视频卡时
- 视频驱动程序不可用或无法正常工作时
- 当视频卡内存不足、挂起或会占用太多系统资源来初始化
利用现有资源进行软件渲染
有一个巨大的社区,许多书籍、网站、SDK、示例、白皮书、邮件列表和其他资源可以帮助你利用 Direct3D 10 及更高版本的基于着色器的图像呈现。 将 WARP 作为软件回退,可以在应用程序与硬件或软件一起运行时,使用有关硬件的现有知识来提高应用程序的性能。 此外,来自图形卡供应商和 DirectX SDK 中的许多优秀工具可以帮助你设计、生成、开发、调试和分析图形应用程序的性能问题。 这些工具和知识现在有利于使用 WARP 时面向硬件和软件的应用程序开发。
启用不需要图形硬件的方案
各种算法和应用程序 (图像处理算法、打印、远程处理、虚拟电脑和其他模拟器、高质量字体呈现、图表、图形等) 通常已针对 CPU 进行了优化,因为它们不依赖于硬件。 使用 WARP,可以使用单个体系结构来运行这些算法和应用程序,并且可以在软件中完全运行;但是,如果硬件加速可用,则可以利用它。
完成 DirectX 图形平台
WARP 允许访问所有 Direct3D 10 及更高版本的图形功能,即使在没有 Direct3D 10 及更高版本的图形硬件的计算机上也是如此。 Direct3D 10 删除了功能位 (上限) ;也就是说,不再需要验证图形功能是否可从图形硬件获得,因为 Direct3D 10 及更高版本可以保证此可用性。 现在,可以使用各种视频卡的所有功能,知道其应用程序的行为和外观将随处可见。 只需在低端视频卡上禁用昂贵的图形功能或呈现到较小的目标,即可缩放这些应用程序的性能。
WARP 功能和要求
WARP 完全支持所有 Direct3D 10 和 10.1 功能。 例如,WARP 支持以下最重要的功能:
- Direct3D 10 和 10.1 规范的所有精度要求
- 当 Direct3D 11 与功能级别 9_1、9_2、9_3、10_0 和 10_1 一起使用时, (有关功能级别的详细信息,请参阅 D3D_FEATURE_LEVEL)
- 所有可选纹理格式,例如多重采样呈现目标和从浮点图面采样
- 抗锯齿、高质量渲染高达 8 倍多采样抗锯齿 (MSAA)
- 各向异性筛选
- 32 位和 64 位应用程序和大型地址感知 32 位应用程序
在 Windows 7 SP1 或 Windows Server 2008 R2 SP1 上安装适用于 Windows 7 的平台更新 时,该操作系统随后会包含 Direct3D 11.1 运行时和支持 Direct3D 11.x 的 WARP 版本,当与 功能级别 9_1、9_2、9_3、10_0、10_1 和 11_0 一起使用时。
Windows 8、Windows 10、Windows Server 2012&上述Windows RT包括 Direct3D 11.1 运行时和新版本的 WARP。 当与 功能级别 9_1、9_2、9_3、10_0、10_1、11_0 和 11_1 一起使用时,此版本支持 Direct3D 11.x。
Windows 10 Fall Creators Update (1709) 包括支持 Direct3D 12 功能级别 12_0 和 12_1 的新版本 WARP。
WARP 的最低计算机要求与 Windows Vista 相同,具体而言:
- 最低 800 MHz CPU
- 不需要 MMX、SSE 或 SSE2
- 最小 512 MB RAM
如何使用 WARP
对于 Direct3D 12,创建 WARP 设备需要首先标识 WARP 适配器。 为了方便执行此操作,DXGI 1.4 提供了 IDXGIFactory4::EnumWarpAdapter 方法。 然后,可以将 WARP 适配器提供给 D3D12CreateDevice 以创建 WARP 设备。
Direct3D 10、10.1 和 11 组件可以使用其他驱动程序类型,可以在创建设备时指定该驱动程序类型 (例如,在) 调用 D3D11CreateDevice 函数时。 该驱动程序类型是 D3D10_DRIVER_TYPE_WARP 或 D3D_DRIVER_TYPE_WARP。 指定驱动程序类型时,运行时会创建 WARP 设备,但不初始化硬件设备。
由于 WARP 使用与参考光栅器相同的 Direct3D 软件接口,因此可以使用 WARP 测试任何支持与参考光栅器一起运行的 Direct3D 应用程序。 若要使用 WARP,请重命名D3d10warp.dll以D3d10ref.dll并将其放置在示例或应用程序所在的文件夹中。 接下来,切换到 ref 时,将看到 WARP 呈现。
如果将 WARP 重命名为 D3d10ref.dll,并将其放置在 C:\Program Files (x86) \Microsoft DirectX SDK () \Samples\C++\Direct3D\Bin\x86 中,则可以通过单击示例中的“切换 Ref”按钮,或使用命令行上指定的 /ref 运行示例来针对 WARP 运行所有 DirectX 示例。
适用于 WARP 的建议应用程序类型
可以使用 Direct3D 的所有应用程序都可以使用 WARP。 这包括以下类型的应用程序:
休闲游戏
游戏通常具有简单的呈现要求。 但是,它们还需要使用可能需要硬件加速的令人印象深刻的视觉效果。 大多数最畅销的 Windows 游戏都是模拟游戏或休闲游戏,这两种游戏都不需要高性能图形。 但是,这两种风格的游戏都极大地受益于基于现代着色器的图形和在硬件上缩放的能力。
现有的非游戏应用程序
大量的图形应用程序在其呈现层中需要最少数量的代码路径。 WARP 使这些应用程序可以实现单个 Direct3D 代码路径,该路径可以面向大量计算机配置。
高级渲染游戏
游戏开发人员可能希望隔离图形卡或特定于驱动程序的呈现错误。 因此,所有游戏(即使是图形要求极高的游戏)都可以受益于使用 WARP 呈现其内容。 可以使用 WARP 来验证你发现的任何视觉项目是否呈现错误或硬件或驱动程序问题。
其他应用程序
WARP 的目标应用程序还包括当前可能不使用 Direct3D 10 或 Direct3D 10.1 的应用程序。 这些目标应用程序包括必须始终在所有计算机上运行的应用程序、不写入 CPU 和 GPU 版本的图像处理算法、速度或使用 GPU 不重要的图像处理算法(如打印)以及显示高级 3D 图形的仿真器和虚拟环境。
WARP 体系结构和性能
WARP 基于参考光栅器代码库。 因此,WARP 对 Direct3D 10 及更高版本以及 DXGI 使用相同的软件接口。 WARP 包含在 Windows 7 中的D3d10warp.dll中,位于 Windows 系统文件夹中。 两个版本的 WARP 安装在 64 位计算机上,即 x86 和 x64 版本。 在某些情况下,x64 版本可能会运行得更快,因为 WARP 中包含的代码生成器可以利用用户运行 64 位应用程序时可用的其他寄存器。
WARP 包含以下两个高速实时编译器:
- 高级中间语言编译器,用于将 HLSL 字节码和当前呈现状态转换为经过优化的矢量命令流,适用于几何图形着色器 (GS) 、顶点着色器 (VS) ,像素着色器 (管道的 PS) 阶段。
- 高性能实时代码生成器,可采用这些命令并生成优化的 SSE2、SSE4.1、x86、x64、arm 和 arm64 程序集代码。
WARP 使用 Windows Vista 中引入的线程池和复杂任务管理和依赖项跟踪,使渲染管道的所有部分都能有效地分布在可用的 CPU 核心之间。
WARP 使用延迟呈现。 也就是说,WARP 可以批量呈现命令,以便仅当有足够的数据可用于有效使用所有 CPU 资源时才会发生光栅化。 应用程序线程上的main工作已最小化,以便应用程序能够尽快提交命令。 如果应用程序也是多线程的,并且它使用线程池,则工作将在 WARP 和应用程序之间均匀分布。
WARP 代码生成器已经过优化,以充分利用新式 CPU 体系结构。 WARP 在可以运行 Windows Vista 及更高版本操作系统的所有计算机上运行,即使计算机不支持 SSE 也是如此。 但是,WARP 已针对支持 SSE2 的计算机进行了优化。 它还包含针对 AMD 和 Intel 处理器的特定体系结构的优化,以及对 SSE 4.1 扩展的支持。
WARP 不需要图形硬件即可执行。 即使在硬件不可用或无法初始化的情况下,它也可以执行。
设计和构建为在 Direct3D 10 及更高版本硬件上运行而没有任何 WARP 知识的应用程序和示例可能会通过使用 WARP 运行良好。 但是,我们建议尽可能降低质量设置和分辨率,以实现可用帧速率。 可以使用 WARP 开发和优化在硬件和软件上运行良好的应用程序。
由于 WARP 使用多个 CPU 核心进行并行执行,因此它在现代多核 CPU 上性能最佳。 在安装了 SSE4.1 扩展的计算机上,WARP 的运行速度也明显加快。 Microsoft 在具有 8 个或更多核心和 SSE4.1 的计算机上执行了重大测试和性能优化,因为这些高端计算机在 Windows 7 及更高版本的操作系统的生存期内将变得更加常见。
当 WARP 在 CPU 上运行时,与图形卡相比,在很多方面都是有限的。 CPU 的前端总线速度通常约为或低于 10 GB/s。 相比之下,图形卡通常具有使用 20 到 100GB/s 或更多图形带宽的专用内存。 图形硬件还具有固定功能单元,可以异步执行复杂且昂贵的任务,例如纹理筛选、格式解压缩或转换,开销或电源成本很少。 就功耗和性能周期而言,在典型 CPU 上执行这些操作的成本很高。
基于 Intel Penryn 的 3.0GHz 四核计算机的典型性能数字表明,在某些情况下,WARP 在很多基准测试上的性能可能优于低端集成 Direct3D 10 及更高版本的图形 GPU。 低端离散图形硬件在运行这些基准时通常比 WARP 快 4 到 5 倍。 这些低端集成或离散 GPU 对 CPU 资源的使用率最低。 对于许多应用程序,中端或高端图形卡比 WARP 快得多,尤其是当应用程序可以利用这些图形卡提供的并行度和内存带宽时。
WARP 不是图形硬件的替代品,特别是低端 Direct3D 10 和更高版本的离散硬件现在成本低廉。 WARP 的目标是允许应用程序以与 Direct3D 兼容的级别硬件为目标,而无需在硬件或软件上运行的代码路径或测试要求显著不同。
以下两个表显示了具有各种 CPU 和图形卡的 WARP 示例数据。
第一个表显示了以 800x600 分辨率运行的 Direct3D 10 Crysis 的 WARP 示例数据,所有质量设置都处于最低级别:
CPU | 时间 | Ave FPS | 最小 FPS | 最小帧数 | 最大 FPS | 最大帧数 |
---|---|---|---|---|---|---|
Core i7 8 Core @ 3.0GHz | 271.57 | 7.36 | 3.46 | 1966 | 15.01 | 995 |
Penryn 4 核心 @ 3.0GHz | 351.35 | 5.69 | 2.49 | 1967 | 10.95 | 980 |
Penryn 2 核 @ 3.0GHz | 573.98 | 3.48 | 1.35 | 1964 | 6.61 | 988 |
核心 2 双核 @ 2.6GHz | 707.19 | 2.83 | 0.81 | 1959 | 5.18 | 982 |
核心 2 双核 @ 2.4GHz | 763.25 | 2.62 | 0.76 | 1964 | 4.70 | 984 |
核心 2 双核 @ 2.1GHz | 908.87 | 2.20 | 0.64 | 1965 | 3.72 | 986 |
Xeon 8 核心 @ 2.0GHz | 424.04 | 4.72 | 1.84 | 1967 | 9.56 | 988 |
AMD FX74 4 核 @ 3.0GHz | 583.12 | 3.43 | 1.41 | 1967 | 5.78 | 986 |
Phenom 9550 4 核 @ 2.2GHz | 664.69 | 3.01 | 0.53 | 1959 | 5.46 | 987 |
第二个表显示了跨各种图形卡运行相同测试的示例数据:
图形卡 | 时间 | Ave FPS | 最小 FPS | 最小帧数 | 最大 FPS | 最大帧数 |
---|---|---|---|---|---|---|
NVIDIA 8800 GTS | 23.58 | 84.80 | 60.78 | 1957 | 130.83 | 1022 |
NVIDIA 8500 GT | 47.63 | 41.99 | 25.67 | 1986 | 72.57 | 991 |
NVIDIA Quadro 290 | 67.16 | 29.78 | 18.19 | 1969 | 49.87 | 1017 |
NVIDIA 8400 GS | 59.01 | 33.89 | 21.22 | 1962 | 51.82 | 1021 |
ATI 3400 | 53.79 | 37.18 | 22.97 | 618 | 59.77 | 1021 |
ATI 3200 | 67.19 | 29.77 | 18.91 | 1963 | 45.74 | 980 |
ATI 2400 PRO | 67.04 | 29.83 | 17.97 | 606 | 45.91 | 987 |
Intel DX10 集成 | 386.94 | 5.17 | 1.74 | 1974 | 16.22 | 995 |
WARP 一致性
WARP 通过所有标准 Windows 硬件质量实验室 (WHQL) 一致性测试来验证 Direct3D 硬件设备。
WARP 已针对一套 Direct3D 10 和 Direct3D 10.1 应用程序和基准测试,以及 DirectX、NVIDIA 和 AMD 中的 SDK 示例。
WARP 在其测试中使用了适用于 Windows 的 PIX 调试和分析工具;Microsoft 具有用于比较硬件和 WARP 的应用程序的单帧捕获的大型库。 大多数图像在硬件和 WARP 之间几乎完全相同;有时出现细微差异时,会发现它们位于 Direct3D 10 规范定义的容差范围内。