C# XNA、向量数学和GPU

C# XNA、向量数学和GPU,c#,vector,xna,gpu,C#,Vector,Xna,Gpu,我正在考虑为Windows Phone和Windows 8 RT制作一个游戏。游戏的第一次迭代将使用XNA作为UI 但由于我计划有其他可能不使用XNA的迭代,我正在一个可移植类库中编写我的核心游戏逻辑 我已经到了我在核心游戏逻辑中计算向量数学(精灵位置)的部分 当我弄明白这一点时,我的一位同事告诉我,我应该确保我在GPU(而不是CPU)上进行这些计算 那么,问题是,如果我使用XNA向量库来进行向量计算,它们是在GPU上自动完成的吗? 附带问题:如果不是,应该在GPU上完成吗?或者我可以在我的可移

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

但由于我计划有其他可能不使用XNA的迭代,我正在一个可移植类库中编写我的核心游戏逻辑

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

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

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

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

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


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

我认为你的同事错了。以下是在GPU上进行此类计算没有意义的两个原因:

最大的原因是,从一开始就把数据放到GPU上并不便宜。然后,从GPU获取数据非常昂贵

#2原因是GPU擅长并行计算——也就是说,它对大量数据执行相同的操作。在中小型数据量上,您将要执行的向量操作是许多不同的操作

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

即使是XNA的内置SpriteBatch也在CPU上完成了它的大部分每精灵工作(除了最终的整体矩阵转换之外的一切)。虽然它可以在GPU上进行每精灵的变换(我认为它在XNA3中也曾如此),但它不能。这使得它能够减少发送GPU所需的数据量(这是一个性能胜利),并使其更加灵活-因为它让顶点着色器自由供您自己使用

这些都是使用CPU的重要原因。我想说,如果这对XNA团队来说足够好的话——对你来说也足够好:)


现在,我认为你的同事的意思可能是——而不是GPU——使用SIMD指令(在CPU上)进行向量计算

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

遗憾的是,微软的.NET运行时目前没有(此类)使用SIMD指令。不过,这是一个好消息

所以,这里有一个问题,如果我使用XNA向量库来进行向量计算,它们是在GPU上自动完成的吗


使用ILSpy查看XNA中的Vector类,可以发现XNA矢量库不使用图形卡进行矢量数学。

脱离主题,但我认为XNA正在走出大门。我建议考虑一下MonoGame的便携性和更好的未来前景。@Adamhuldsworth-我正计划转向MonoGame。我听说从XNA移植到Monogame非常简单。所以我想我从XNA开始,然后把它移植过来。假设你的PCL从XNA的Vector2类开始(这是一个很好的开始,因为它非常健壮)。Vector2是由2个浮点数组成的结构。据我所知,它的方法都是由CIL管理的。如果你没有在“一个巨大的3d游戏”上工作,那么你的同事在将vector2计算移到GPU上时看到了什么好处?您必须在HLSL(.NET)或DirectX或OpenGL中编写自己的GPU接口,这听起来很耗时。我想也许你的同事参与了一些错误的优化。