Opengl vulkan中的异步渲染模型

Opengl vulkan中的异步渲染模型,opengl,vulkan,Opengl,Vulkan,最近我在读,上面写着: OpenGL ES使用同步渲染模型,这意味着API调用的行为必须与所有之前的API调用都已处理过一样。实际上,现代GPU都不是这样工作的,渲染工作负载是异步处理的,而同步模型是由设备驱动程序维护的一个复杂的幻觉。为了保持这种假象,驱动程序必须跟踪队列中每个渲染操作读取或写入的资源,确保工作负载以合法顺序运行以避免渲染损坏,并确保需要数据资源块的API调用并等待该资源安全可用 Vulkan使用异步渲染模型,反映了现代GPU的工作方式。应用程序将渲染命令排入队列,使用显式调度

最近我在读,上面写着:

OpenGL ES使用同步渲染模型,这意味着API调用的行为必须与所有之前的API调用都已处理过一样。实际上,现代GPU都不是这样工作的,渲染工作负载是异步处理的,而同步模型是由设备驱动程序维护的一个复杂的幻觉。为了保持这种假象,驱动程序必须跟踪队列中每个渲染操作读取或写入的资源,确保工作负载以合法顺序运行以避免渲染损坏,并确保需要数据资源块的API调用并等待该资源安全可用

Vulkan使用异步渲染模型,反映了现代GPU的工作方式。应用程序将渲染命令排入队列,使用显式调度依赖项控制工作负载执行顺序,并使用显式同步原语对齐依赖的CPU和GPU处理

这些更改的影响是显著降低了图形驱动程序的CPU开销,而代价是要求应用程序处理依赖关系管理和同步

有人能解释一下为什么异步渲染模型可以减少CPU开销吗?因为在Vulkan,你仍然需要自己跟踪状态

有人能解释一下为什么异步渲染模型可以 减少CPU开销

首先,让我们回到你提到的原始陈述,强调我的:

这些更改的影响是显著减少CPU 图形驱动程序的开销,[…]

因此,这里的说法是,驱动程序本身将需要消耗更少的CPU,而且很容易看出,因为它可以更直接地转发您的请求

然而,像Vulkan这样的低级别渲染API的一个总体目标是总体上减少CPU开销,而不仅仅是在驱动程序中

考虑以下示例:您有一个绘制调用,该调用将渲染到纹理。然后还有另一个draw调用,它从这个纹理中采样

要获得正确的隐式同步,驱动程序必须跟踪此纹理的使用情况,包括作为纹理采样操作的渲染目标和源

它不预先知道下一个draw调用是否需要在前一个draw调用中仍要写入的任何资源。它必须始终跟踪每一个可能的此类冲突,无论它们是否会发生在您的应用程序中。而且它的决定也必须非常保守。您可能为绘制调用的帧缓冲区绑定了纹理,但您可能知道,使用为此着色器设置的实际统一值,不会修改纹理。但是GPU驱动程序不能知道这一点。如果它不能绝对肯定地排除资源被修改的可能性,那么它必须假设它被修改了

但是,您的应用程序更希望了解这些详细信息。如果您有多个渲染过程,第二个过程将取决于第一个过程中渲染到的纹理,那么您可以而且必须添加适当的同步基本体-但是GPU驱动程序根本不需要关心为什么需要进行任何同步,也不需要跟踪任何资源使用情况来确定-它可以按照指示执行。在许多情况下,您的应用程序也不需要跟踪自己的资源使用情况。这是您编写代码时的用法所固有的,在某个时刻可能需要同步。但在某些情况下,您可能仍需要跟踪自己的资源使用情况以了解情况,特别是如果您编写一些中间层,比如更高级的图形库,您对渲染结构的了解越来越少,那么您将进入一个类似于GL驱动程序必须做的工作的位置,除非您想像Vulkan一样将所有同步负担转给库的用户

有人能解释一下为什么异步渲染模型可以 减少CPU开销

首先,让我们回到你提到的原始陈述,强调我的:

这些更改的影响是显著减少CPU 图形驱动程序的开销,[…]

因此,这里的说法是,驱动程序本身将需要消耗更少的CPU,而且很容易看出,因为它可以更直接地转发您的请求

然而,像Vulkan这样的低级别渲染API的一个总体目标是总体上减少CPU开销,而不仅仅是在驱动程序中

考虑以下示例:您有一个绘制调用,该调用将渲染到纹理。然后还有另一个draw调用,它从这个纹理中采样

要获得正确的隐式同步,驱动程序必须跟踪此纹理的使用情况,包括作为纹理采样操作的渲染目标和源

它事先不知道下一次抽签是否需要任何决议 在以前的绘制调用中仍要写入的源。它必须始终跟踪每一个可能的此类冲突,无论它们是否会发生在您的应用程序中。而且它的决定也必须非常保守。您可能为绘制调用的帧缓冲区绑定了纹理,但您可能知道,使用为此着色器设置的实际统一值,不会修改纹理。但是GPU驱动程序不能知道这一点。如果它不能绝对肯定地排除资源被修改的可能性,那么它必须假设它被修改了

但是,您的应用程序更希望了解这些详细信息。如果您有多个渲染过程,第二个过程将取决于第一个过程中渲染到的纹理,那么您可以而且必须添加适当的同步基本体-但是GPU驱动程序根本不需要关心为什么需要进行任何同步,也不需要跟踪任何资源使用情况来确定-它可以按照指示执行。在许多情况下,您的应用程序也不需要跟踪自己的资源使用情况。这是您编写代码时的用法所固有的,在某个时刻可能需要同步。但在某些情况下,您可能仍需要跟踪自己的资源使用情况以了解情况,特别是如果您编写一些中间层,比如更高级的图形库,您对渲染结构的了解越来越少,那么您将进入一个类似于GL驱动程序必须做的工作的位置,除非您想像Vulkan一样将所有同步负担转给库的用户