2012-12-06 73 views
4

我正在研究为Windows Phone和Windows 8 RT制作游戏。游戏的第一次迭代将使用XNA作为用户界面。XNA,矢量数学和GPU

但因为我计划有可能不使用XNA其他迭代的,我写在便携式类库我的核心游戏逻辑。

我已经得到了到我在哪里在核心游戏逻辑计算矢量数学(子画面的位置)的一部分。

当我搞清楚了这一点,我有一个同事告诉我,我应该确保我的GPU(而不是CPU)做这些计算。

所以,这里是一个问题,如果我使用XNA矢量库做我的矢量计算,都将自动在GPU上做了什么?

边问:如果不是,它们应当在GPU上做了什么?或者我可以在我的Portable Class Library中执行它们并让CPU运行它们吗?

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

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

+0

偏离主题,但我认为XNA正在走出门外。我建议寻找MonoGame的便携性和更好的未来前景。 –

+1

@AdamHouldsworth - 我打算转到MonoGame。我听说从XNA移植到Monogame是非常容易的。所以我想我从XNA开始,然后移植它。 – Vaccano

+0

假设你的PCL从XNA的Vector2类开始(这是一个很好的开始,因为它非常强大)。 Vector2是一个由2个浮点组成的结构。据我所知,它的方法都是CIL。如果你不是在开发一个“巨大的3D游戏”,那么你的同事在将vector2计算移到GPU中看到了什么好处?您必须在HLSL(.NET)或DirectX或OpenGL中编写自己的接口到GPU,这听起来很耗时。我认为也许你的同事搞了一些错误的优化。 –

回答

5

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

第一个原因,非常大的一个原因是,将数据导入GPU中并不便宜第一名。然后它是极其昂贵的从GPU获取数据返回

#2的原因是GPU好做并行计算 - 那就是 - 它确实对数据的相同操作。你将要做的矢量操作的种类有很多不同操作,上一个中小型数据量。

因此,如果 - 说 - 你正在GPU上做一个粒子系统,那么你会得到一个巨大的胜利。这是大量的同类数据,您可以在每个粒子上执行相同的操作,并且所有数据都可以存在于GPU上。

即使XNA的内置SpriteBatch它的大部分每精灵工作在CPU上(除最终的整体矩阵转换外)。虽然它可以在GPU上进行每个精灵转换(我认为它已经用于XNA 3),但它并没有。这使得它可以减少发送GPU所需的数据量(性能优势),并使其更加灵活 - 因为它使顶点着色器免费供您自己使用。

这些是使用CPU的重要原因。我会说,如果它的XNA团队不够好 - 这是配不上你:)


现在,我认为你的同事可能意味着 - 而不是GPU - 是做使用SIMD指令的矢量数学(在CPU上)。

这些给你一个表现胜利。例如 - 添加矢量通常需要添加X组件,然后添加Y组件。使用SIMD允许CPU同时添加两个组件。

不幸的是,微软的.NET运行时目前没有(使用这种)SIMD指令。不过,这是supported in Mono

1

所以,这里是一个问题,如果我使用XNA矢量库来做矢量计算,它们是否会自动在GPU上完成?

使用ILSpy查看XNA中的Vector类,发现XNA Vector库不使用图形卡作为向量数学。