godot 中实现图形和渲染的驱动有哪些

Godot 的图形渲染驱动主要有以下几种:

  1. Vulkan 驱动
  • 位于 drivers/vulkan/
  • 现代图形 API 实现
  • 提供最好的性能和最新特性
  • 主要用于高端 PC 和主机平台
  1. OpenGL ES 3.0 驱动
  • 位于 drivers/gles3/
  • 用于移动设备和较旧设备
  • 包含多个子系统:
    • effects: 特效渲染
    • environment: 环境渲染
    • shaders: 着色器系统
    • storage: 存储管理
  1. DirectX 12 驱动
  • 位于 drivers/d3d12/
  • Windows 平台专用
  • 提供原生 DirectX 性能
  1. Metal 驱动
  • 位于 drivers/metal/
  • Apple 平台专用 (iOS/macOS)
  • 利用 Metal API 优化性能

底层抽象:

RenderingDevice (抽象接口)
    ├── RenderingDeviceVulkan
    ├── RenderingDeviceGLES3
    ├── RenderingDeviceD3D12
    └── RenderingDeviceMetal

选择渲染驱动的考虑因素:

  • 平台兼容性
  • 硬件能力
  • 性能需求
  • API 可用性
  • 开发便利性

这种多驱动设计让 Godot 能够:

  • 适应不同平台需求
  • 提供最佳性能
  • 保持良好兼容性
  • 灵活选择合适的渲染后端

Vulkan 应该是全平台通用吧

理论上 Vulkan 确实是跨平台的图形 API,但实际应用中存在一些限制:

  1. 平台支持情况:
  • Windows: 完全支持
  • Linux: 完全支持
  • Android: 部分设备支持
  • macOS/iOS: 需要通过 MoltenVK 转译层 (将 Vulkan 转为 Metal)
  • Nintendo Switch: 支持
  • Web 平台: 通过 WebGPU 支持 (仍在发展中)
  1. 硬件要求:
  • 需要支持 Vulkan 的 GPU
  • 较老的设备可能不支持
  • 移动设备需要相对较高端的芯片
  1. 为什么 Godot 还需要其他图形 API:
  • 兼容性考虑:支持更多设备
  • 性能考虑:在某些平台原生 API 可能更优
  • 开发难度:不同平台调试工具不同
  • 生态系统:某些平台更偏好自己的 API
  1. Vulkan 的优势:
  • 低开销
  • 高性能
  • 精确控制
  • 更好的多线程支持
  • 跨平台一致性

所以虽然 Vulkan 是很好的跨平台方案,但为了更好的兼容性和性能,支持多种图形 API 仍然是必要的。

Vulkan 和 DirectX 12 对比

Vulkan 和 DirectX 12 都是现代的底层图形 API,它们有很多共同点和区别:

  1. 共同特点:
  • 都是 ” 底层 “API,提供对 GPU 的直接控制
  • 都支持多线程渲染
  • 都需要开发者自己管理更多细节
  • 都提供了降低 CPU 开销的机制
  • 性能水平相近
  1. 主要区别:

平台支持:

  • DirectX 12:仅支持 Windows 和 Xbox 平台
  • Vulkan:跨平台,支持 Windows、Linux、Android 等

API 设计理念:

  • DirectX 12:更符合 Windows 生态习惯,与其他 Windows API 风格一致
  • Vulkan:注重跨平台一致性,API 设计更 ” 纯粹 ”

内存管理:

// DirectX 12 的内存管理
ID3D12Resource* buffer;
device->CreateCommittedResource(
    &heapProperties,
    D3D12_HEAP_FLAG_NONE,
    &desc,
    D3D12_RESOURCE_STATE_GENERIC_READ,
    nullptr,
    IID_PPV_ARGS(&buffer)
);
 
// Vulkan 的内存管理
VkBuffer buffer;
VkDeviceMemory memory;
vkCreateBuffer(device, &createInfo, nullptr, &buffer);
vkAllocateMemory(device, &allocInfo, nullptr, &memory);
vkBindBufferMemory(device, buffer, memory, 0);

调试工具:

  • DirectX 12:PIX 等微软官方工具,与 Visual Studio 深度集成
  • Vulkan:Validation Layers,RenderDoc 等第三方工具
  1. 性能比较:
  • CPU 开销:两者相似
  • GPU 利用率:取决于具体实现
  • 驱动优化:DirectX 在 Windows 上可能更有优势
  • 内存开销:理论上相似,实际依赖于实现
  1. 开发难度:
  • DirectX 12:文档更完善,工具链更成熟
  • Vulkan:学习曲线可能更陡,但跨平台性更好
  1. 使用场景:
  • DirectX 12:Windows/Xbox 游戏开发
  • Vulkan:跨平台游戏、引擎开发

选择考虑因素:

  • 是否需要跨平台
  • 团队已有的技术储备
  • 开发工具链偏好
  • 目标平台的驱动支持情况

网上关于两者对比的一些讨论:

从概念上看,它们非常相似,但 API 的学习难度肯定不同。我之前有过 DX 经验,所以一开始使用 DX12 比较容易。然而,在尝试了 Vulkan 之后,我发现 API 更加一致,最终也更有意义了。

Vulkan 拥有广泛的支持,包括众多书籍、大量开源代码、教程等,这也有帮助。因此在这种情况下,您可能会更好地使用 Vulkan,因为周围有更多的帮助。

最后,如果您想要任何形式的跨平台支持,那么 Vulkan 是更好的选择。使用 DX12,您只能使用相对较新的 Windows 版本(如果您在意的话,还有 Xbox),而 Vulkan 可以在多个操作系统平台和移动设备上运行。

D3D12 的语法简洁得多。有些人认为这真的很重要。Vulkan 的布局更清晰,文档也更好。再加上更容易扩展和跨平台支持,我认为 Vulkan 是明智的选择(我两者都用,因为我是个受虐狂)。

DX12 的文档很糟糕(如果你甚至可以称之为文档的话)。Vulkan 的概念稍微多一些。我无论如何都会选择 Vulkan。

请记住,Vulkan 和 D3D12 是表兄弟。它们彼此之间的相似性比它们各自的前身(OpenGL、Direct3D11)更高。

与 dx12 相比,我更容易上手 Vulkan。我觉得 Vulkan 作为 C api 更简洁。dx 12 到处都是 comptr,乱糟糟的

我更喜欢 Vulkan,但 DirectX 12 在 API 方面也差不了多少。对于 Windows 独有的东西,我使用 DX12;对于任何跨平台的东西,我都使用 Vulkan。

我认为 DirectX12 是一个更简单、更干净的 API。由于它是面向桌面的(Windows PC 和 Xbox One 基本相同),因此许多概念都得到了简化,使用起来也更直观。

另一方面,Vulkan 必须有大量样板才能在广泛的设备上得到支持,因此需要更多时间来理解和习惯它。

就文档和可用性而言,我认为它们是一样的。这两个 API 都需要先验知识才能使用它们。

选择取决于您是否需要支持 Windows 以外的其他平台。另外,我想说的是,对于 iOS/Mac OS X,通过 MoltenVK 实现 Vulkan 并不是很有用,因为 MoltenVK 仅实现了 Vulkan 1.0 功能。因此,在这种情况下,Apple 的 Metal 是主要选择。

Android 自版本 10 起才正确支持 Vulkan。

DirectX 对初学者来说很糟糕!

它被称为“行业标准”,但没有任何适合初学者的文档或教程。

我从据说与 OpenGL 4.6 类似的 DirectX 11 开始,但我发现它极其困难,难到让我对图形开发失去了动力,几乎完全放弃了编码。

DirectX 12 是一个专家 API,它建立在对 DirectX 11 的了解之上。DirectX 12 是一个极低级的 API,专为对现代 GPU 硬件架构有深入了解的图形专家设计,并且可以从头开始编写 DirectX 11 运行时。

直接来自 Microsoft Repo 的 DirectXTK

您需要非常熟练掌握 DirectX 11,这样您“基本上可以从头开始编写 DirectX 11 运行时”。这间接意味着您知道如何编写图形驱动程序!

所有这些只是为了开始学习 DirectX 12!

我甚至无法在 DX11 中编写一个基本的“Hello Triangle”程序,我怎么能考虑 DX12 呢?

这需要您成为 DX11 的“专家”!经验如此丰富,以至于您可以从头开始重写它!

Vulkan 由 Khronos Group 开发,该组织由 150 多家公司组成,负责 OpenGL、WebGL、Anari 和其他几个 API。它最初基于一个名为 Mantle 的 API,由 AMD 开发,后来被放弃。Vulkan 被认为是 OpenGL 的后继者,OpenGL 是一种自 1992 年以来就存在的图形 API。

Vulkan 是一种低开销 API,与 DirectX 相比,它需要的系统资源(例如 CPU 计算、内存和带宽)更少。这使得它在配置较低的计算机上成为比 DirectX 12 更好的选择。或者至少,在 CPU 性能较低的计算机上。

大多数基准测试都认为 Vulkan 在帧率 上略胜一筹,但 FPS 波动更频繁。

Vulkan 和 DirectX 之间的主要区别在于跨平台兼容性。DirectX 是为 Windows 开发的,并且仅适用于 Windows。这意味着,例如,为 Microsoft操作系统 开发的游戏必须移植到不同的 API 才能发布到游戏机上。

Vulkan 是一个跨平台 API,兼容 Linux、Android、任天堂、MacOS 和许多其他操作系统。这使开发人员可以更快、更轻松地为多个平台制作游戏,而无需为每个平台完全重写游戏。

从长远来看,这可能是 Vulkan 的制胜因素。随着游戏继续从更传统的 PC 或游戏机转向移动和 基于云的游戏,专注于 Vulkan 可能会对开发人员更有吸引力。

DirectX 12 的游戏开发难度更大,但该 API 的存在时间比 Vulkan 更长,开发者可能更熟悉它。

为什么在 PC 端都不怎么考虑 OpenGL 了

OpenGL 在 PC 端逐渐被淘汰的原因有几个:

  1. 性能限制:
  • OpenGL 是高级 API,底层细节被驱动封装
  • 驱动层优化和开销较大
  • 多线程支持不理想
  • 状态机设计导致 CPU 开销高
  1. 架构老旧:
  • 1992 年设计,当时的硬件架构很不同
  • 固定渲染管线的历史包袱
  • API 设计不适合现代 GPU
  • 扩展系统过于复杂
  1. 维护和发展:
  • Khronos 组织转向发展 Vulkan
  • 驱动厂商更专注于新 API 支持
  • 游戏引擎逐渐放弃支持
  • 新特性更新缓慢
  1. 与现代 API 对比:
// OpenGL 代码示例 - 状态机模式
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, size, data, GL_STATIC_DRAW);
 
// Vulkan 代码示例 - 显式控制
VkBufferCreateInfo createInfo = {...};
vkCreateBuffer(device, &createInfo, nullptr, &buffer);
vkBindBufferMemory(device, buffer, memory, 0);
  1. 行业趋势:
  • 游戏开发转向 Vulkan/DX12
  • 硬件厂商主推新 API
  • 新技术(光追等)主要在新 API 实现
  • 开发工具对新 API 支持更好

因此现代 PC 游戏开发主要选择 Vulkan 或 DirectX 12,OpenGL 主要用于:

  • 老项目维护
  • 简单的图形应用
  • 教学用途
  • 需要广泛兼容性的工具软件