Multithreading 多线程渲染D3D/OpenGL/Whatever

Multithreading 多线程渲染D3D/OpenGL/Whatever,multithreading,opengl,directx,Multithreading,Opengl,Directx,我读了很多关于多线程渲染的书。人们一直在提出各种奇怪而奇妙的方案,用线程将作品提交到GPU,以加快帧速率并获得更多的渲染效果,但我对整个过程有一点概念上的问题,我想我会让这里的专家来运行它,看看你的想法 据我所知,GPU上并发的基本单元是Warp。也就是说,它在像素级别是向下的,而在几何体提交级别是向上的。因此,考虑到GPU上的并发单元是warp,必须使用互斥锁将驱动程序紧紧锁定,以防止多个线程相互干扰提交。如果是这种情况,我看不出编码到D3D或OpenGL多线程原语的好处在哪里 当然,在多线程

我读了很多关于多线程渲染的书。人们一直在提出各种奇怪而奇妙的方案,用线程将作品提交到GPU,以加快帧速率并获得更多的渲染效果,但我对整个过程有一点概念上的问题,我想我会让这里的专家来运行它,看看你的想法

据我所知,GPU上并发的基本单元是Warp。也就是说,它在像素级别是向下的,而在几何体提交级别是向上的。因此,考虑到GPU上的并发单元是warp,必须使用互斥锁将驱动程序紧紧锁定,以防止多个线程相互干扰提交。如果是这种情况,我看不出编码到D3D或OpenGL多线程原语的好处在哪里

当然,在多线程场景中使用GPU的最有效的方法是在更高的抽象级别,在提交之前,您正在收集要做的大量工作?我的意思是,与其随机交错来自多个线程的命令,我本以为一个块可以接受来自多个线程的工作,但其中有一点智能,可以确保在提交到渲染器之前,为了更好的性能排序,如果您想使用多个线程,这将是一个更大的收益

那么,在实际的API中,D3D/OpenGL多线程渲染支持在哪里呢


帮我解决我的困惑

您的问题源于对“使其渲染器多线程化”和“多线程渲染”之间区别的误解

“渲染器”,或者更准确地说是“渲染系统”,不仅仅是向API发出渲染命令。它必须洗牌记忆。它可能需要将纹理动态加载到图形内存中或从图形内存中加载。在某些渲染过程之后,它可能必须读回数据。等等

使渲染器多线程的意思就是:使渲染系统使用多线程。这可能是线程化场景图管理任务,如构建要渲染的对象列表(截锥体剔除、BSP、入口等)。这可能是一个专门用于纹理存储管理的线程,它可以根据需要交换纹理,从磁盘加载等等。这可能与D3D11中的命令列表一样,在D3D11中,您可以与其他任务并行构建一系列渲染命令


渲染过程(将实际渲染命令提交到API)不是线程化的。您通常有一个线程负责基本的
glDraw*
::DrawIndexedPrimitive
工作。D3D11命令列表允许您构建这些命令的序列,但它们不会与其他渲染命令并行执行。是呈现线程和主上下文负责实际发出命令列表;命令列表只是为了使将该列表放在一起更方便线程使用。

在Direct3D 11中,您通常会创建延迟上下文,以便从工作线程对其进行绘制调用。一旦工作完成并准备好渲染,就可以从每个延迟上下文生成一个命令列表,并在即时(前线程)上下文中执行它。这允许在多个线程中组合绘制调用,同时保留绘制调用的正确顺序等。

您所说的“多线程渲染”是什么意思?因为这两个API都不允许多线程渲染。D3D11命令在不同线程上列出,以及“在不同线程上生成的并发对象”,在OpenGL中,有无数的博客和帖子试图“使其渲染器多线程化”—太多了,无法计数:)。啊哈。我懂了。所以实际上,它只是一个花哨的裤子命令列表。