复杂性OpenGL和Vulkan [关闭]

问题描述 投票:-3回答:2

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

当我第一次看到这个时,我有点震惊。一开始我的课程不会是庞大而复杂的,但随着时间的推移,他们会这样做。现在我正在考虑学习Vulkan(我发现了一本非常易于理解的书)或者切换到DirectX 11或者12(我在windows下编程)。

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

与DirectX一样,随着程序规模的增加,所需的时间会增加,在某些时候不再可行吗?

关于附加图形,游戏是用DirectX而不是OpenGL编写的原因是什么?

opengl directx complexity-theory vulkan
2个回答
-2
投票

作为制作游戏引擎的人,我可以告诉你现代的openGL是一个绝对可以运行游戏的强大工具。它不是一个玩具,可以驱使你基本上三A级。 Windows游戏使用DirectX的原因是因为DirectX是微软制造的windows的图形API。

当您创建游戏引擎时,渲染API不是您将要处理的东西。

你大部分时间都会把它包装成你的东西,所以打电话给OpenGL并不是你要做的那么多。事实上,您可能希望实现DirectX渲染和OpenGL渲染以及Vulkan渲染以便为用户提供选择,您只需实现它并在引擎核心的某处忘记它。

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


2
投票

我没有你所指的那本书,但我会说这个图表通常是正确的,只要:

  1. 您将“Previous graphics API”替换为“OpenGL和Direct3D pre-12”。
  2. 您将“Vulkan”替换为“Vulkan和Direct3D 12”。
  3. 您将“努力和时间消耗”替换为“优化所需的努力”。
  4. 您将“程序复杂性和大小”替换为“渲染的场景复杂性和大小”

二分法不是Vulkan与其他一切。它是即时API(OpenGL / D3D11)与命令缓冲API(Vulkan / D3D12)。使即时API难以处理的事情不是你的程序所做的事情;这是你的程序与GPU交互的方式。

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

命令缓冲区API倾向于暴露更多内存管理的低级细节。它们直接向您呈现原始内存块与该内存的特定用途(缓冲区和纹理)之间的二分法。它们公开了特定的内存池以及分配实现支持的内存的方法,它们强迫您询问哪些内存对象可以进入哪些池。等等。

但是你可以更好地控制正在发生的事情。如果您正在做一些需要控制的事情,那么这种控制才真正重要。

如果你正在制作像Civilization IV这样的高度复杂的程序......你实际上通常不关心这种控制。为什么?因为CivIV的复杂性与它的渲染系统无关;它的复杂性在于实际的游戏玩法,人工智能等等。当然,命令缓冲区API可能仍然有助于提高性能,但渲染性能不太可能成为瓶颈。

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

这是对图表的错误解释。

“不可能做”的领域本质上意味着你可以获得更好的渲染性能,但OpenGL / D3D11不允许你访问它。也就是说,无论您如何优化代码,对获得的速度都有一个严格的限制。

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

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

命令缓冲区API专为线程呈现而设计。单个线程提交命令,但可以在任何线程上生成命令。这使得理论上可以在命令缓冲区API中实现更高的命令吞吐量,这是直接API所允许的。

© www.soinside.com 2019 - 2024. All rights reserved.