Rob*_*son 6 opengl directx multithreading
我一直在阅读很多关于多线程渲染的内容.人们一直在提出各种奇怪而精彩的方案,用于通过线程向GPU提交工作,以加快帧速率并获得更多的东西,但是我对整个事情有一点概念上的问题而且我以为我会在这里由大师来看看你的想法.
据我所知,GPU上的基本并发单位是Warp.也就是说,它在像素级别下降而不是在几何提交级别上升.因此,考虑到GPU上的并发单位是warp,驱动程序必须与互斥锁紧密锁定,以防止多个线程搞砸彼此的提交.如果是这种情况,我不知道编码D3D或OpenGL多线程原语的好处在哪里.
当然,在多线程场景中使用GPU的最有效方法是在更高的抽象级别,在提交之前,您要收集多批工作?我的意思是,而不是随机地交叉来自多个线程的命令,我会认为一个块接受来自多个线程的工作,但是在其内部具有一点智能以确保在提交给渲染器之前为了更好的性能而排序事物,将是如果你想使用多个线程,会获得更大的收益.
那么,D3D/OpenGL多线程渲染是否支持实际的API?
帮助我解决困惑!
你的问题来自对"使他们的渲染器多线程"和"多线程渲染"之间的区别的误解.
"渲染器",或者更确切地说是"渲染系统",不仅仅是向API发出渲染命令.它必须改变记忆.它可能必须动态加载纹理进出图形内存.它可能必须在一些渲染过程之后读回数据.等等.
使渲染器多线程意味着:使渲染系统使用多个线程.这可能是线程场景图管理任务,如构建要渲染的对象列表(视锥体剔除,BSP,门户等).这可能是一个专门用于纹理存储管理的线程,它根据需要交换纹理,从磁盘加载等.这可能与D3D11的命令列表一样,您可以在其中与其他任务并行构建一系列渲染命令.
渲染的过程,即向 API提交实际渲染命令,没有线程化.您通常有一个负责基础glDraw*或::DrawIndexedPrimitive工作的线程.D3D11命令列表允许您构建这些命令的序列,但它们不与其他渲染命令并行执行.它是渲染线程和主要上下文,负责实际发出命令列表; 命令列表只是为了使该列表更加线程友好.