多线程渲染D3D / OpenGL /随便

时间:2013-05-28 13:11:22

标签: multithreading opengl directx

我一直在阅读很多关于多线程渲染的内容。人们一直在提出各种奇怪而精彩的方案,用于通过线程向GPU提交工作,以加快帧速率并获得更多的东西,但是我对整个事情有一点概念上的问题而且我以为我会在这里由大师来看看你的想法。

据我所知,GPU上的基本并发单位是Warp。也就是说,它在像素级别下降而不是在几何提交级别上升。因此,考虑到GPU上的并发单位是warp,驱动程序必须与互斥锁紧密锁定,以防止多个线程搞砸彼此的提交。如果是这种情况,我不知道编码D3D或OpenGL多线程原语的好处在哪里。

当然,在多线程场景中使用GPU的最有效方法是在更高的抽象级别,在提交之前,您要收集多批工作?我的意思是,而不是随机交错来自多个线程的命令,我会认为一个块接受来自多个线程的工作,但内部有一点智能,以确保在之前订购以获得更好的性能提交给渲染器,如果你想使用多个线程,将获得更大的收益。

那么,D3D / OpenGL多线程渲染是否支持实际的API?

帮助我解决困惑!

2 个答案:

答案 0 :(得分:8)

你的问题来自对“使他们的渲染器多线程”和“多线程渲染”之间的区别的误解。

“渲染器”,或者更确切地说是“渲染系统”,不仅仅是向API发出渲染命令。它必须改变记忆。它可能必须动态加载纹理进出图形内存。它可能必须在一些渲染过程之后读回数据。等等。

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

呈现的过程,即向API提交实际呈现命令,线程。您通常有一个线程负责基本的glDraw*::DrawIndexedPrimitive工作。 D3D11命令列表允许您构建这些命令的序列,但它们不与其他渲染命令并行执行。它是渲染线程和主要上下文,负责实际发出命令列表;命令列表只是为了使该列表更加线程友好。

答案 1 :(得分:1)

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