复杂性 OpenGL 和 Vulkan

Complexity OpenGL and Vulkan

我一直在考虑开始学习 OpenGL(当然是核心配置文件),直到我阅读了一本书的预览,在那里我找到了附带的图形。

当我第一次看到这个的时候,我有点震惊。一开始我的程序不会很大很复杂,但随着时间的推移它们会。现在我正在考虑学习 Vulkan(我找到了一本非常容易理解的书)或切换到 DirectX 11 oder 12(我在 windows 下编程)。

这里有一些问题: 这里有没有人用 OpenGL 编写过如此广泛和复杂的程序,以至于在某些时候它们在时间和精力方面不再可行?

DirectX 是否也一样,随着程序大小的增加,所需的时间也会增加,并且在某些时候不再可行?

关于附图,是不是因为游戏是用DirectX而不是OpenGL写的?

作为制作游戏引擎的人,我可以告诉你,现代 openGL 是一个强大的工具,绝对可以 运行 游戏。它不是玩具,基本上可以让你达到三倍 A 水平。 windows的游戏之所以使用DirectX,是因为DirectX是微软制作的windows的API图形。

当您创建游戏引擎时,渲染 API 并不是您要一直处理的事情。

您大部分时间都将把它包装在您的工作中,因此无论如何调用 OpenGL 都不是您要做的那么多事情。事实上,您可能希望同时实现 DirectX 渲染和 OpenGL 渲染以及 Vulkan 渲染,以便为用户提供选择,您只需实现它,然后将其遗忘在引擎核心的某个地方。

无论您的项目规模如何,您从三者中选择哪一个都可以完成工作。有些可能针对您的系统进行了更优化,并为您提供更好的整体性能。 OpenGL 不会限制你。 我建议从 openGL 和 cpp 开始。你可以用它完成真正的工作并且是跨平台的(忘记 mac)。如果你只关心 windows 而不是你应该使用 DirectX 它是 API 用于 windows 和 Xbox 你会玩得很开心。

我没有你所指的那本书,但我会说图表大体上是正确的,只要:

  1. 您将"Previous graphics API"替换为"OpenGL and Direct3D pre-12"。

  2. 您将"Vulkan"替换为"Vulkan and Direct3D 12"。

  3. 您将"effort and time consumption"替换为"effort needed to optimize"。

  4. 你把"program complexity and size"换成"rendered scene complexity and size"

二分法不是 Vulkan 与其他一切。它是即时 APIs (OpenGL/D3D11) 与命令缓冲区 APIs (Vulkan/D3D12)。使直接 APIs 难以处理的事情不是你的程序做了什么;这就是您的程序必须与 GPU 交互的方式。

直接 APIs 隐藏了抽象背后的内存管理的许多方面。因此,如果您需要对内存执行非常具体的操作(您只需要在涉及大型复杂场景的高性能场景中执行此操作),那么这些 API 往往会妨碍您。

命令缓冲区API倾向于公开更多内存管理的底层细节。它们直接向您展示了原始内存块和该内存的特定用途(缓冲区和纹理)之间的二分法。它们公开了特定的内存池和实现支持的分配内存的方式,并且它们迫使您询问哪些类型的内存对象可以进入哪些池。等等。

但是您可以更好地控制正在发生的事情。只有当你在做一些需要控制的事情时,这种控制才真正重要。

如果您正在制作像文明 IV 这样的高度复杂的程序...您实际上通常 不关心 该控件。为什么?因为 CivIV 的复杂性与其渲染系统有关而不是;它的复杂性在于实际的游戏玩法、AI 等等。当然,命令缓冲区 APIs 可能仍然有助于提高性能,但渲染性能不太可能成为瓶颈。

Has anyone here ever written programs with OpenGL that were so extensive and complex that at some point they were no longer feasible in terms of time and effort?

这是对图表的错误解释。

"impossible to do" 的域本质上意味着您可以获得更好的渲染性能,但 OpenGL/D3D11 不 让您访问它 。也就是说,无论您如何优化代码,您获得的速度都有一个硬性限制。

该领域主要是关于即时 API 没有有效的线程渲染方法这一事实。他们所有的渲染工作都必须发生在同一个线程上。这意味着您的渲染性能将受到 CPU 的时钟速度和指令吞吐量(以及缓存架构和其他一些东西)的速度的限制。

因此,如果您的场景足够复杂,足以使 CPU 的单个线程完全饱和,那么直接 API 就无法使您的场景渲染速度更快。有一些优化可以提高吞吐量,但是一旦您采用了所有这些……您就没有技巧了。

命令缓冲区API设计用于线程渲染。单个线程提交命令,但可以在任何线程上生成命令。这使得理论上可以在命令缓冲区 APIs 中实现更高的命令吞吐量,这将被立即 APIs.

所允许。