XNA、向量数学和GPU

4

我正在研究为Windows Phone和Windows 8 RT制作游戏。游戏的第一版将使用XNA进行用户界面设计。

但由于我计划有其他版本可能不使用XNA,因此我正在Portable Class Library中编写我的核心游戏逻辑。

我已经开始计算核心游戏逻辑中的向量数学问题(精灵位置)。

当我在弄清楚这个问题时,我的同事告诉我要确保这些计算是在GPU上完成的(而不是CPU)。

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

附带问题:如果不是,它们应该在GPU上完成吗?或者让CPU运行它们是否可以?

注意:如果我需要XNA来执行这些计算以便可以使用GPU,则从XNA向我的核心逻辑注入该功能并不难。我只想知道这是否是我真正应该做的事情。

注意II:我的游戏是一个2D游戏。它将计算坏人和抛射物沿着向量移动的路径。(意思是这不是一个巨大的3D游戏。)


离题了,但我认为XNA已经走向衰落。我建议考虑使用MonoGame来实现可移植性和更好的未来前景。 - Adam Houldsworth
1
@AdamHouldsworth - 我计划转向MonoGame。我听说从XNA到MonoGame的移植非常容易。所以我想先用XNA开始,然后再进行移植。 - Vaccano
假设您的PCL从类似于XNA的Vector2类开始(这是一个很好的起点,因为它非常强大)。 Vector2是由2个浮点数组成的结构体。据我所知,它的方法都是托管CIL。如果您不是在“一个巨大的3D游戏”上工作,那么您的同事将向GPU移动vector2计算有什么好处?您必须编写自己的HLSL(.NET)或DirectX或OpenGL GPU接口,这听起来很耗时。我认为也许您的同事正在进行一些虚假的优化。 - Reacher Gilt
2个回答

5
我认为您的同事错了。以下是两个不合理将此类计算放在GPU上的原因:
第一原因,成本非常高昂,首先需要将数据传输到GPU上。然后从GPU中获取数据也是极其昂贵的。
第二原因是,GPU适用于进行并行计算,即对大量数据执行相同操作。而您将要执行的向量操作是许多不同的操作,并且数据量较小到中等。
所以,如果您在GPU上执行粒子系统等任务,将会获得巨大的收益。这是大量同质数据,您对每个粒子执行相同的操作,所有数据都可以存储在GPU上。
即使是XNA内置的SpriteBatch也大多数在CPU上完成其每个精灵的工作(除了最终的整体矩阵变换)。虽然它可以在GPU上进行每个精灵的变换(我认为在XNA 3中曾经这样做),但它没有这样做。这使得它可以减少需要发送给GPU的数据量(提高性能),并使它更加灵活 - 因为它将顶点着色器空闲出来供您使用。
这些都是使用CPU的好理由。我会说,如果它对XNA团队足够好 - 那么它对你也足够好 :)
现在,我认为你的同事可能想要使用SIMD指令(在CPU上)来进行向量数学运算,而不是GPU。
这将使性能提高。例如,添加向量通常需要您先添加X分量,然后再添加Y分量。使用SIMD允许CPU同时添加两个分量。
遗憾的是,Microsoft的.NET运行时目前不会(此类)使用SIMD指令。不过,在Mono中支持。

1
如果我使用XNA向量库进行向量计算,它们会自动在GPU上完成吗?
通过使用ILSpy查看XNA中的Vector类,可以发现XNA向量库不使用图形卡进行向量数学运算。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接