c# - XNA、矢量数学和 GPU

标签 c# vector xna gpu

我正在研究为 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/

相关文章:

c# - 从依赖于另一个注册元素的 ServiceStack 的 IoC 容器解析

c++ - 我可以使用插入函数将值插入指针 vector 吗?

类对象的 std::vector 的 C++ 析构函数问题

c# - C# 列表和 ArgumentOutOfRangeException 的问题

c# - 如何使用另一个 C# 程序启动 XNA 游戏

c# - XNA 3.1 项目无法在 Windows 8 中构建

c# - WPF DataGridColumn 不接受 0

c# - 是否可以仅为 MVC/Controller Action 请求执行 IHttpModule?

c++ - cudaMallocManaged with vector<complex<long double>> C++ - NVIDIA CUDA

c# - 在 XNA 中,是否有从位图对象创建 Texture2D 的快速替代方法?