4

我正在考虑为 Windows Phone 和 Windows 8 RT 制作游戏。游戏的第一次迭代将使用 XNA 作为 UI。

但是由于我计划进行其他可能不使用 XNA 的迭代,所以我正在将我的核心游戏逻辑编写在可移植类库中。

我已经到了在核心游戏逻辑中计算矢量数学(精灵位置)的部分。

当我弄清楚这一点时,我的一位同事告诉我,我应该确保我在 GPU(而不是 CPU)上进行这些计算。

那么,问题来了,如果我使用 XNA 矢量库进行矢量计算,它们会自动在 GPU 上完成吗?

附带问题:如果不是,它们应该在 GPU 上完成吗?或者我可以在我的便携式类库中执行它们并让 CPU 运行它们吗?

注意:如果我需要让 XNA 执行它们以便我可以使用 GPU,那么从 XNA 将该功能注入到我的核心逻辑中并不难。我只是想知道这是否是我真正应该做的事情。

注二:我的游戏是2D游戏。它将计算坏人和射弹沿向量的运动。(这意味着这不是一个巨大的 3D 游戏。)

4

2 回答 2

5

我认为你的同事弄错了。这只是在 GPU 上进行这种计算没有意义的两个原因:

第一个原因,很大程度上是因为首先将数据放到 GPU 上并不便宜。然后从 GPU取回数据非常昂贵。

#2 原因是 GPU 非常适合进行并行计算 - 也就是说 - 它对大量数据执行相同的操作。您将要进行的向量操作类型有很多不同的操作,适用于中小型数据量。

因此,如果——比如说——你在 GPU 上做一个粒子系统,你会获得巨大的胜利。这是大量的同质数据,你对每个粒子执行相同的操作,所有数据都可以存在于 GPU 上。

甚至 XNA 的内置程序也在SpriteBatchCPU 上完成了大部分每个精灵的工作(除了最终的整体矩阵转换之外的所有工作)。虽然它可以在 GPU 上进行 per-sprite 变换(我认为它曾经在 XNA 3 中使用过),但它不能。这允许它减少发送 GPU 所需的数据量(性能优势),并使其更加灵活 - 因为它让顶点着色器免费供您自己使用。

这些都是使用 CPU 的重要原因。我会说它对 XNA 团队来说是否足够好 - 它对你来说已经足够好了 :)


现在,我认为您的同事可能的意思——而不是 GPU——是使用 SIMD 指令(在 CPU 上)进行矢量数学运算。

这些为您带来性能上的胜利。例如 - 添加矢量通常需要您添加 X 分量,然后是 Y 分量。使用 SIMD 允许 CPU 同时添加两个组件。

遗憾的是,微软的 .NET 运行时目前没有(这种)使用 SIMD 指令。不过,它在 Mono中得到支持。

于 2012-12-07T11:09:54.017 回答
1

那么,问题来了,如果我使用 XNA 矢量库进行矢量计算,它们会自动在 GPU 上完成吗?

使用 ILSpy 查看 XNA 中的 Vector 类会发现 XNA Vector 库不使用显卡进行矢量数学运算。

于 2013-07-22T02:34:07.730 回答