我正在研究保留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]解决的。
以上最后一段可能都不是准确的,但是我试图给出一个我要寻找的例子,而没有试图写出严重错误的东西。
答案 0 :(得分:4)
这有可能基于意见。我想我只想重申包装盒上写的Vulkan优势,希望没有争议。
答案 1 :(得分:3)
Vulkan在运行时行为方面确实具有四个主要优势:
显着降低GPU负载并不是优势之一;使用这两个API的相同内容使用相同的GPU功能将具有非常相似的GPU性能。
在我看来,它在开发人员可用性方面也具有许多优势-程序员的模型比OpenGL干净得多,但是要达到“正常工作”阶段,学习曲线就更加陡峭。
让我们更详细地了解每个优点:
Vulkan中较低的CPU负载来自多个方面,但主要的方面是:
OpenGL驱动程序执行各种“魔术”操作,以提高性能(基于仅在绘制时才知道的状态来指定着色器),或维护同步渲染错觉(在运行时创建资源重影以避免在运行时停滞管道)应用程序会修改仍由挂起命令引用的资源。
Vulkan的设计理念是“没有魔术”。当您需要时,您就能得到所要的东西。希望这意味着不会出现随机减速,因为驱动程序正在后台执行您不希望的操作。缺点是应用程序承担了做正确事情的责任;)
OpenGL设计的许多部分基于不同的CPU和GPU内存池,这些内存池需要一个编程模型,该模型为驱动程序提供足够的信息以使它们保持同步。大多数现代硬件在硬件支持的一致性协议上都可以做得更好,因此Vulkan启用了一个模型,您可以在其中映射一次缓冲区,然后对其进行即席修改并保证“其他进程”将看到更改。不再需要“ map” /“ unmap” /“ invalidate”开销(前提是平台支持一致的缓冲区,当然,它仍然不是通用的)。
第二,Vulkan分开了内存分配的概念和该内存的使用方式(内存视图)。这样可以将相同的内存回收用于帧管道中的不同对象,从而减少了需要分配的中间存储量。
关于CPU性能的“无魔术”注释,Vulkan不会即时生成随机资源(例如,重影纹理)以隐藏应用程序问题。资源内存占用空间不再出现随机波动,但是应用程序必须再次承担起做正确事情的责任。