我正在阅读《Practical rendering with DirectX 11》,想在深入了解 DirectX 概念后编写一个简单的引擎。
但是今天我们有 DirectX 12,它解决了驱动程序开销问题(因为我们更接近硬件),我正在考虑使用 12 作为我的主要渲染器。但是在开发结束时,我的引擎会成为某种驱动程序开销吗?我认为驱动程序开发人员比我聪明得多,所以我可以让 12 渲染比 11 慢。对吧?
我正在阅读《Practical rendering with DirectX 11》,想在深入了解 DirectX 概念后编写一个简单的引擎。
但是今天我们有 DirectX 12,它解决了驱动程序开销问题(因为我们更接近硬件),我正在考虑使用 12 作为我的主要渲染器。但是在开发结束时,我的引擎会成为某种驱动程序开销吗?我认为驱动程序开发人员比我聪明得多,所以我可以让 12 渲染比 11 慢。对吧?
DirectX 11 和 DirectX 12 以不同的方式解决了相同的问题。它们都驱动相同的硬件并可以访问相同的硬件功能。区别在于如何管理 CPU 和内存。
对于 DirectX 11,API 是“低级”的,但 DirectX 运行时管理视频内存、协调资源上传/下载、处理缓冲区重命名,并确保 GPU 和 CPU 之间的正确同步。
使用 DirectX 12,DirectX Runtime 做的很少,应用程序负责DirectX 11 Runtime 将为您处理的所有事情。这对于允许应用程序对硬件的驱动方式进行更多控制非常强大,但这意味着程序员有责任在不寻常的情况下和在各种硬件中正确处理所有事情。
图形编程和调试已经是一个挑战,使用 DirectX 12 会极大地复杂化时序问题(类似于进行多线程无锁编程时可能遇到的风险)、更多特定于供应商的行为,需要更多的测试验证、资源管理可能在多个帧上发生的问题,以及所有可编程着色器如何管理与 PCU 的信息共享的更多责任。
如果您不熟悉使用 DirectX 进行图形编程,那么我强烈建议您使用 DirectX 11。即使最终使用 DirectX 12 对您有意义,API 设计和文档也假定您已经是 DirectX 11 编程和 HLSL 方面的专家。一旦您成为 DirectX 11 专家,那么将 DirectX 12 用于您的特定项目可能仍然没有意义,除非您发现 DirectX 11 API 的 CPU 开销确实是一个瓶颈。对于主要对学习技术感兴趣的人来说,两者都值得学习,但您应该首先牢牢掌握 DirectX 11。
同样重要的是要注意 DirectX 11 和 DirectX 12 具有不同的系统要求。DirectX 11 在 Windows 7、Windows 8.1 和 Windows 10 上受支持,并且需要 WDDM 1.x 驱动程序,这些驱动程序可广泛用于从Direct3D 硬件功能级别9.1 到 11.1 的视频硬件。DirectX 12 在 Windows 10(包括 Xbox One)上受支持,并且需要 WDDM 2.0 驱动程序,这些驱动程序并非适用于所有视频硬件。WDDM 2.0 驱动程序可广泛用于大多数 Direct3D 功能级别 11.0 或更高版本的硬件,这些硬件是市场上面向“核心 PC 游戏玩家”的大多数 GPU,但不适用于商业环境或旧 PC 游戏系统中使用的大部分视频卡。
现在,使用 DirectX 12 的“最佳位置”是如果您正在编写游戏并且拥有一支规模庞大、经验丰富的图形开发人员团队;面向控制台、“核心”PC 游戏玩家和/或桌面通用 Windows 平台 (UWP);并期望游戏受 CPU 限制。
请参阅DirectX 11和DirectX 12的DirectX 工具包