【发布时间】:2019-11-08 01:20:21
【问题描述】:
我正在考虑是继续使用 OpenGL 还是考虑迁移 Vulkan 以进行密集的瓶颈渲染。
但是,我不想在没有被告知的情况下跳槽。我一直在查找 Vulkan 为我提供了哪些好处,但是通过大量的谷歌搜索,我无法找到确切什么可以提高性能。人们会抛出诸如“OpenGL 很慢,Vulkan 更快!”之类的术语。或“低功耗!”就这个话题不要再说什么了。
因此,我很难评估我所面临的问题是否是 Vulkan 可以帮助我解决的问题,或者我的问题是由于数量和计算问题(在这种情况下 Vulkan 将无济于事)我很)。
我假设 Vulkan 不会神奇地使管道中的事情变得更快(因为三角形的着色在 OpenGL 和 Vulkan 之间对于相同的缓冲区、制服和着色器将大致相同)。我假设 OpenGL 中所有导致悲伤的事情(例如:帧缓冲区和着色器程序更改)在任一 API 中都会同样痛苦。
我认为 Vulkan 提供了一些基于在线阅读无数内容的想法(我猜这肯定不是所有优势,或者这些是否是真的):
没有 [much?任何?] 绑定(或者更确切地说是“无绑定纹理”的更好版本),当我切换到无绑定纹理时我注意到了这一点,我获得了显着的性能提升,但如果无绑定纹理有效,这甚至可能不值得一提这样做,因此不确定 Vulkan 是否在此处添加任何内容
通过编写某种可以在 GPU 上执行而无需发送大量数据的命令列表来减少 CPU/GPU 通信
能够以 OpenGL 无法以某种方式实现的多线程方式进行接口
但是我不知道人们在现实世界中遇到了哪些需要这些的情况,以及 OpenGL 是如何限制这些的。到目前为止,网上所有的例子都说“你可以跑得更快!”但我还没有看到人们如何使用它来跑得更快。
我在哪里可以找到回答这个问题的信息?或者你知道一些可以为我回答这个问题的具体例子吗?或许更好的问题是,人们使用 OpenGL(或 D3D)最初导致 Vulkan 成为一件事的典型痛点在哪里?
不令人满意的答案示例如下:
您可以更快地进行多线程处理并将内容提交给 Vulkan。
但更令人满意的回应是
在 Vulkan 中,您可以对 GPU 的提交进行多线程处理。在 OpenGL 中,您不能这样做,因为您依赖实现来代表您执行适当的锁定和放置栅栏,这可能最终会造成瓶颈。一个简单的例子是[这里的简短例子,OpenGL 没有针对情况 X 切割它的情况],而在 Vulkan 中,它通过 [动作 Y] 解决。
上面的最后一段可能并不准确,但我试图给出一个我正在寻找的例子,而不是试图写出严重错误的东西。
【问题讨论】: