Vulkan可以具体做什么OpenGL 4.6+无法做到的?

时间:2019-06-26 07:01:08

标签: opengl vulkan

我正在研究保留OpenGL还是考虑进行密集瓶颈渲染的Vulkan迁移是否更合适。

但是,我不想在不知情的情况下进行跳跃。我一直在寻找Vulkan给我带来的好处,但是通过大量的搜索,我无法完全理解 可以提高性能的东西。人们会抛出诸如“ OpenGL慢,Vulkan快得多”之类的术语!或“低功耗!”就此事再说一遍。

因此,这使我很难评估我面临的问题是否是Vulkan可以帮助我解决的问题,或者我的问题是由于数量和计算所致(在这种情况下,Vulkan会无济于事)我很多)。

我假设Vulkan不会神奇地使管道中的内容变快(因为对于相同的缓冲区,统一和着色器,OpenGL和Vulkan之间的三角形阴影将大致相同)。我假设OpenGL中所有引起悲伤的事物(例如:帧缓冲区和着色器程序更改)在这两个API中都会同样痛苦。

我认为Vulkan在网上阅读了无数内容后,脑中浮现出一些东西(我想这肯定不是全部优点,或者甚至不是真的):

  • 没有[太多? ]绑定(或更确切地说是“无边界纹理”的更好版本),当我切换到无边界纹理时,我注意到了这一点,我获得了显着的性能提升,但是,如果有效地实现了无边界纹理,这甚至不值得一提这样做,因此不确定Vulkan是否在此处添加任何内容

  • 通过编写一些可以在GPU上执行而无需发送大量数据的命令列表来减少CPU / GPU的通信

  • 能够以多线程方式进行OpenGL无法连接的方式

但是,我不确切知道人们在现实世界中遇到哪些情况需要这些条件,以及OpenGL如何限制这些条件。到目前为止,所有在线示例都说“您可以运行得更快!”但是我还没有看到人们如何使用它来更快地运行。

在哪里可以找到可以回答此问题的信息?还是您知道一些实际的例子可以为我解答?也许更好的问题是,人们最初使用OpenGL(或D3D)时遇到的典型痛点在哪里导致Vulkan成为一件事?

一个不令人满意的答案示例是

  

您可以多线程并更快地将其提交给Vulkan。

但更令人满意的响应将是

  

在Vulkan中,您可以将提交的内容多线程化到GPU。在OpenGL中,您无法执行此操作,因为您依靠实现来进行适当的锁定并代表您放置栅栏,这最终可能会造成瓶颈。一个简单的例子是[这里是OpenGL在X情况下没有裁剪的情况下的简短例子],而在Vulkan中,它是通过[动作Y]解决的。

以上最后一段可能都不是准确的,但是我试图给出一个我要寻找的例子,而没有试图写出严重错误的东西。

2 个答案:

答案 0 :(得分:4)

这有可能基于意见。我想我只想重申包装盒上写的Vulkan优势,希望没有争议。

  • 您可以在Vulkan中禁用验证。显然,这种方式使用的CPU(或电池\电源\噪声)更少。在某些情况下,这可能很重要。
  • OpenGL确实定义不正确的多线程。 Vulkan在规范中定义良好的多线程。这意味着您不会立即失去尝试使用多个线程进行编码的能力,并且如果单线程可能会成为CPU的瓶颈,则可以提高性能。
  • Vulkan更明确;它不会(或尝试不)暴露大的魔术黑匣子。这意味着您可以对微结结和挂接以及其他微优化做一些事情。
  • Vulkan的窗户系统界面更简洁。不再有奇怪的上下文和默认的帧缓冲区。 Vulkan甚至不需要窗口即可绘制(或者它可以实现而无需怪异的破解)。
  • Vulkan是更干净,更常规的API。对我来说,这意味着更容易学习(尽管有其他东西)并且使用起来更令人满意。
  • Vulkan采用二进制中间代码着色器。虽然OpenGL以前没有这么做。那应该意味着可以更快地编译此类代码。
  • Vulkan具有移动GPU作为头等公民。没有更多ES。
  • Vulkan具有开源和常规(GitHub)公共跟踪器。这意味着您无需经历麻烦就可以改善生态系统。例如。您可以改善\实施验证检查,以检查经常跳闸的错误。或者,您可以改进规范,这样对于那些不是内部人员的人确实有意义。

答案 1 :(得分:3)

Vulkan在运行时行为方面确实具有四个主要优势:

  • 降低CPU负载
  • 可预测的CPU负载
  • 更好的内存接口
  • 可预测的内存负载

显着降低GPU负载并不是优势之一;使用这两个API的相同内容使用相同的GPU功能将具有非常相似的GPU性能。

在我看来,它在开发人员可用性方面也具有许多优势-程序员的模型比OpenGL干净得多,但是要达到“正常工作”阶段,学习曲线就更加陡峭。

让我们更详细地了解每个优点:

降低CPU负载

Vulkan中较低的CPU负载来自多个方面,但主要的方面是:

  • API鼓励预先构造描述符,因此您不必在逐个绘制的基础上重建状态。
  • API是异步的,因此可以将一些职责(例如跟踪资源依赖关系)移至应用程序。一个简单的应用程序实现与OpenGL一样慢,但是该应用程序具有更大的范围来应用高级算法优化,因为它可以知道如何使用资源以及资源与场景结构的关系。
  • API将错误检出移至层驱动程序,因此发行版驱动程序尽可能精简。
  • API鼓励多线程,这总是一个巨大的胜利(尤其是在移动设备上,例如,四个线程运行缓慢将比一个快速运行线程消耗更少的能量)。

可预测的CPU负载

OpenGL驱动程序执行各种“魔术”操作,以提高性能(基于仅在绘制时才知道的状态来指定着色器),或维护同步渲染错觉(在运行时创建资源重影以避免在运行时停滞管道)应用程序会修改仍由挂起命令引用的资源。

Vulkan的设计理念是“没有魔术”。当您需要时,您就能得到所要的东西。希望这意味着不会出现随机减速,因为驱动程序正在后台执行您不希望的操作。缺点是应用程序承担了做正确事情的责任;)

更好的内存接口

OpenGL设计的许多部分基于不同的CPU和GPU内存池,这些内存池需要一个编程模型,该模型为驱动程序提供足够的信息以使它们保持同步。大多数现代硬件在硬件支持的一致性协议上都可以做得更好,因此Vulkan启用了一个模型,您可以在其中映射一次缓冲区,然后对其进行即席修改并保证“其他进程”将看到更改。不再需要“ map” /“ unmap” /“ invalidate”开销(前提是平台支持一致的缓冲区,当然,它仍然不是通用的)。

第二,Vulkan分开了内存分配的概念和该内存的使用方式(内存视图)。这样可以将相同的内存回收用于帧管道中的不同对象,从而减少了需要分配的中间存储量。

可预测的内存负载

关于CPU性能的“无魔术”注释,Vulkan不会即时生成随机资源(例如,重影纹理)以隐藏应用程序问题。资源内存占用空间不再出现随机波动,但是应用程序必须再次承担起做正确事情的责任。