我的 xna 游戏中有一个照明系统,它循环遍历每个灯光,并将这些灯光添加到包含所有灯光的最终灯光贴图中。
创建这些灯光的过程涉及到许多与图形设备有关的功能,例如使用效果/着色器和绘图来渲染目标,以及使用 graphics.device.clear 清除渲染目标等
所以我的问题是,是否可以对每个灯进行多线程处理?或者这是不可能的,因为只有 1 个图形设备,并且一次只能使用 1 个线程?如果可能,它会提高性能吗?
我的 xna 游戏中有一个照明系统,它循环遍历每个灯光,并将这些灯光添加到包含所有灯光的最终灯光贴图中。
创建这些灯光的过程涉及到许多与图形设备有关的功能,例如使用效果/着色器和绘图来渲染目标,以及使用 graphics.device.clear 清除渲染目标等
所以我的问题是,是否可以对每个灯进行多线程处理?或者这是不可能的,因为只有 1 个图形设备,并且一次只能使用 1 个线程?如果可能,它会提高性能吗?
基本上没有。在GraphicsDevice
XNA 中是单线程的渲染。您可以从多个线程向 GPU 发送资源(纹理、顶点缓冲区等)。但是你只能从你的主线程调用Draw
(和其他渲染函数,如)。Present
我听说有人通过适当的锁定从多个线程成功地完成了渲染类型的事情。但这似乎是“坏巫术”。正如链接的帖子所说:“ XNA 框架文档在这里没有做出任何承诺”。更不用说:即使正确锁定也很棘手。
我不太确定要制作多个图形设备 - 我自己没有尝试过。我认为这是可能的,但你不能在设备之间共享资源——这使得它相当无用。可能不值得努力。
正如 jalf 在对您的问题的评论中提到的那样 - 一旦您使用 GPU,一切都已经并行处理。因此,这仅在您因达到批处理限制而受到 CPU 限制时才有用(因为几乎所有不是您的批处理的东西都可以移动到另一个线程)。在这种情况下,首先要考虑许多优化以减少批次数量 - 在尝试像这样的疯狂方案之前。(而且你已经衡量了你的表现,对吧?)
听起来您可能正在尝试将一个相当复杂的场景渲染到后台的渲染目标,并将负载分散到许多帧中。在这种情况下 -如果性能要求要求它- 您可能可以在主线程上跨多个帧进行渲染,手动调度它。不要忘记设置RenderTargetUsage.PreserveContents
,以便每次将其放在图形设备上时它都不会被清除。