2012-08-12 251 views
0

我在我的xna游戏中有一个照明系统,通过每个灯光循环,并将这些灯光添加到包含所有灯光的最终灯光地图中。是否可以多线程调用GPU?

创建这些灯的过程涉及与图形设备做很多功能,比如使用效果/着色器和绘图渲染目标,并使用graphics.device.clear清除渲染目标等

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

+2

GPU所做的一切已经在数百个线程中并行化。编程GPU时不要考虑CPU线程。 – jalf 2012-08-12 23:05:52

+0

但是在XNA编程中,您已经将图形设备设置为目标渲染目标,并且您绘制的所有内容都是针对该目标渲染的,这意味着您的GPU所执行的任何操作。执行我想要的过程涉及使用多个渲染目标并多次更改图形设备目标,因此,如果我在此过程中创建了多个线程,它们是否会相互干扰? – 2012-08-13 10:59:55

回答

1

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

我有heard of people成功地从多线程渲染类型的东西,适当的锁定。但是,这似乎是“糟糕的巫术”。正如链接的帖子所说:“XNA Framework文档没有在这里做任何承诺”。更不用说:即使获得锁定权也很棘手。

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

正如贾尔夫在你的问题的评论中提到的 - 一旦你到达GPU,一切都已并行处理。因此,如果由于命中batch limit而导致CPU受限(因为几乎所有不是批次的都可以将移动到另一个线程),CPU才会有用。在这种情况下,有许多优化措施可以首先考虑减少批次数量 - 然后尝试这样的疯狂计划。 (你已经测量了你的性能,对吧?

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

相关问题