【问题标题】:Is it possible to multi thread something that calls GPU?是否可以对称为 GPU 的东西进行多线程处理?
【发布时间】:2012-08-09 05:14:02
【问题描述】:

我的 xna 游戏中有一个照明系统,它循环遍历每个灯光,并将这些灯光添加到包含所有灯光的最终灯光贴图中。

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

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

【问题讨论】:

  • GPU 所做的一切都已经在数百个线程中并行化。在对 GPU 进行编程时,不要考虑 CPU 线程。
  • 但是在 XNA 编程中,你已经将你的图形设备设置为一个目标渲染目标,你绘制的所有东西都指向那个目标,这意味着你的 gpu 所做的一切都指向那个目标。做我想做的事情的过程涉及使用多个渲染目标和多次更改图形设备目标,所以如果我创建了这个进程的多个线程,它们会相互干扰吗?

标签: c# multithreading performance xna gpu


【解决方案1】:

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

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

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

正如 jalf 在对您的问题的评论中提到的那样 - 一旦您使用 GPU,一切都已经并行处理。因此,这只有在您因点击batch limit 而受到 CPU 限制时才有用(因为几乎所有不是您的批次的东西 都可以移动到另一个线程)。在这种情况下,首先要考虑许多优化以减少批次数量 - 在尝试像这样的疯狂方案之前。 (你已经衡量了你的表现,对吗?)

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 2011-03-13
    • 2014-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多