我正在研究为Windows Phone和Windows 8 RT制作游戏.游戏的第一次迭代将使用XNA作为UI.
但是因为我计划进行其他可能不使用XNA的迭代,所以我在可移植类库中编写了我的核心游戏逻辑.
我已经到了核心游戏逻辑中计算向量数学(精灵位置)的部分.
当我想到这一点时,我有一个同事告诉我,我应该确保我在GPU(而不是CPU)上进行这些计算.
所以,问题是,如果我使用XNA矢量库进行矢量计算,它们是否会在GPU上自动完成?
问题:如果没有,它们应该在GPU上完成吗?或者我可以在我的可移植类库中执行它们并让CPU运行它们吗?
注意:如果我需要让XNA执行它们以便我可以使用GPU,那么从XNA向我的核心逻辑注入该功能并不困难.我只想知道这是不是我应该做的事情.
注意二:我的游戏是2D游戏.它将计算沿着矢量的坏人和射弹的运动.(这意味着这不是一个巨大的3D游戏.)
我认为你的同事是错的.以下只是在GPU上进行此类计算的两个原因没有意义:
第一个原因是,将数据放到GPU上并不便宜.然后,它是极其昂贵的,以获取数据回从GPU.
第二个原因是GPU适合进行并行计算 - 也就是说 - 它对大量数据执行相同的操作.您将要进行的矢量操作类型是针对中小数据量的许多不同操作.
所以,如果你说你在GPU上做粒子系统,那么你将获得巨大的胜利.这是大量的同类数据,您可以对每个粒子执行相同的操作,并且所有数据都可以存储在GPU上.
即使是XNA的内置功能,SpriteBatch它的大多数每个精灵都可以在CPU上运行(除最终的整体矩阵转换外).虽然它可以在GPU上进行per-sprite变换(我认为它曾经在XNA 3中使用过),但事实并非如此.这样可以减少发送GPU所需的数据量(性能提升),并使其更加灵活 - 因为它可以让顶点着色器免费供您自己使用.
这些都是使用CPU的重要原因.我会说XNA团队是否足够好 - 这对你来说已经足够了:)
现在,我认为你的同事可能意味着 - 而不是GPU - 是使用SIMD指令(在CPU上)进行矢量数学运算.
这些可以让您获得成功.例如 - 添加矢量通常需要添加X组件,然后添加Y组件.使用SIMD允许CPU同时添加两个组件.
可悲的是,微软的.NET运行时目前没有(这种)使用SIMD指令.但它在Mono中得到了支持.
| 归档时间: |
|
| 查看次数: |
1182 次 |
| 最近记录: |