是否有可能多线程调用GPU?

时间:2012-08-12 22:44:45

标签: c# multithreading performance xna gpu

我的xna游戏中有一个照明系统,可以循环显示每个灯光,然后将这些灯光添加到最终的灯光图中,其中包含所有灯光。

创建这些灯光的过程涉及许多与图形设备有关的功能,例如使用效果/着色器和绘图来渲染目标,以及使用graphics.device.clear来清除渲染目标等等。

所以我的问题是,是否有可能多线程?或者这是不可能的,因为只有1个图形设备,一次只有1个线程可以使用它?如果有可能,它会提高性能吗?

1 个答案:

答案 0 :(得分:1)

基本上没有。 XNA中的GraphicsDevice是单线程进行渲染。您可以从多个线程向GPU发送资源(纹理,顶点缓冲区等)。但是你只能从主线程中调用Draw(和其他渲染函数,如Present)。

我已经heard of people成功地从多个线程执行渲染类型的事情并且具有适当的锁定。但这似乎是“糟糕的伏都教”。正如链接的帖子所说:“ XNA Framework文档在这里没有做出任何承诺”。更不用说:即使获得正确的锁定也很棘手。

我不太确定制作多个图形设备 - 我自己没试过。我认为这是可能的,但你不能在设备之间共享资源 - 这使得它毫无用处。可能不值得努力。

正如jalf在你的问题评论中提到的那样 - 一旦你进入GPU,一切都已经并行处理了。因此,如果由于点击batch limit而导致CPU受限,这将非常有用(因为几乎所有不是您的批次的都可以移动到另一个线程)。在这种情况下,在尝试像这样的疯狂计划之前,首先要考虑减少批量数量的许多优化。 (你已经衡量了你的表现,对吧?

听起来你可能要做的就是在背景中渲染一个相当复杂的场景到渲染目标,并将负载分散到许多帧中。在这种情况下 - 如果性能要求决定它 - 您可以在主线程上跨多个帧进行渲染,手动调度它。不要忘记设置RenderTargetUsage.PreserveContents,这样每次将它放在图形设备上时都不会被清除。