我正在研究为 Windows Phone 和 Windows 8 RT 制作游戏。游戏的第一次迭代将使用 XNA 作为 UI。
但由于我计划进行可能不使用 XNA 的其他迭代,所以我在可移植类库中编写我的核心游戏逻辑。
我已经到了在核心游戏逻辑中计算矢量数学( Sprite 位置)的部分。
当我弄清楚这个问题时,一位同事告诉我,我应该确保我在 GPU(而不是 CPU)上进行这些计算。
那么,问题来了,如果我使用 XNA 矢量库进行矢量计算,它们会自动在 GPU 上完成吗?
附带问题:如果不是,它们应该在 GPU 上完成吗?或者我可以在我的可移植类库中执行它们并让 CPU 运行它们吗?
注意:如果我需要让 XNA 执行它们以便我可以使用 GPU,那么不难从 XNA 将该功能注入(inject)到我的核心逻辑中。我只是想知道这是否是我真正应该做的事情。
注意二:我的游戏是2D游戏。它将计算坏人和射弹沿着矢量的运动。 (这意味着这不是一个巨大的 3D 游戏。)
最佳答案
我认为你的同事弄错了。以下是在 GPU 上进行此类计算没有意义的两个原因:
第一大原因是,首先将数据传输到 GPU 并不便宜。然后从 GPU 返回数据非常昂贵。
第二个原因是 GPU 非常适合进行并行计算 - 也就是说 - 它对大量 数据执行相同 操作。您将在中小型数据量上进行的矢量运算有许多不同运算。
因此,如果您在 GPU 上执行粒子系统,那么您将获得巨大的成功。它是大量同质数据,您对每个粒子执行相同的操作,所有数据都可以在 GPU 上运行。
即使是 XNA 的内置 SpriteBatch
也是在 CPU 上完成大部分的每个 Sprite 工作(除了最终的整体矩阵转换之外的所有工作)。虽然它可以在 GPU 上进行每个 Sprite 的转换(我认为它曾经在 XNA 3 中这样做过),但它不能。这允许它减少发送 GPU 所需的数据量(性能胜利),并使其更加灵活 - 因为它让顶点着色器免费供您自己使用。
这些都是使用 CPU 的重要理由。我会说如果它对 XNA 团队来说足够好 - 它对你来说足够好:)
现在,我认为您的同事可能意味着 - 而不是 GPU - 是使用 SIMD 指令(在 CPU 上)进行矢量数学计算。
这些会给你带来性能上的胜利。例如 - 添加矢量通常需要您添加 X 分量,然后是 Y 分量。使用 SIMD 允许 CPU 同时添加这两个组件。
遗憾的是,Microsoft 的 .NET 运行时当前不使用(这种)SIMD 指令。这是supported in Mono , 不过。
关于c# - XNA、矢量数学和 GPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13752539/