4

Windows Phone と Windows 8 RT 向けのゲームの作成を検討しています。ゲームの最初の反復では、UI に XNA を使用します。

しかし、XNA を使用しない他のイテレーションを予定しているため、コア ゲーム ロジックをポータブル クラス ライブラリに記述しています。

コア ゲーム ロジックでベクトル演算 (スプライトの位置) を計算している部分に到達しました。

これを理解していたとき、同僚に、これらの計算を (CPU ではなく) GPU で行っていることを確認する必要があると言われました。

XNA ベクトル ライブラリを使用してベクトル計算を行う場合、それらは GPU で自動的に実行されますか?

副次的な質問: そうでない場合、GPU で実行する必要がありますか? それとも、ポータブル クラス ライブラリでそれらを実行し、CPU で実行しても問題ありませんか?

注: GPU を使用できるように XNA にそれらを実行させる必要がある場合、その機能を XNA からコア ロジックに挿入することは難しくありません。それが本当にやるべきことなのか知りたいだけです。

注 II:私のゲームは 2D ゲームです。ベクトルに沿った悪者と発射体の動きを計算します。(つまり、これは巨大な 3D ゲームではありません。)

4

2 に答える 2

5

あなたの同僚は間違っていると思います。GPU でこの種の計算を行うことが意味をなさない理由の 2 つを次に示します。

一番の理由は、非常に大きな差で、そもそも GPU にデータを取得するのが安くないことです。そして、GPU からデータを取り戻すには非常にコストがかかります。

2 番目の理由は、GPU が並列計算を実行するのに適していることです。つまり、大量のデータに対して同じ操作を実行します。実行するベクトル操作の種類は、少量から中量のデータに対するさまざまな操作です。

たとえば、GPU でパーティクル システムを実行していれば、大きな成果が得られます。これは大量の均質なデータであり、各パーティクルに対して同じ操作を実行すると、すべてのデータが GPU 上に存在する可能性があります。

XNA のビルトインでさえSpriteBatch、スプライトごとの作業のほとんどを CPU で実行します (最終的な全体的な行列変換以外のすべて)。GPU でスプライトごとの変換を実行できますが (XNA 3 では使用されていたと思います)、そうではありません。これにより、GPU に送信する必要があるデータの量を減らすことができ (パフォーマンスの向上)、より柔軟になります。頂点シェーダーを自由に使用できるようにするためです。

これらは、CPU を使用する大きな理由です。それが XNA チームにとって十分であれば、それで十分だと思います :)


さて、あなたの同僚が意味していたのは、GPU ではなく、(CPU 上で) SIMD 命令を使用してベクトル計算を行うことでした。

これらにより、パフォーマンスが向上します。たとえば、通常、ベクトルを追加するには、X コンポーネントを追加してから Y コンポーネントを追加する必要があります。SIMD を使用すると、CPU は両方のコンポーネントを同時に追加できます。

残念ながら、Microsoft の .NET ランタイムは現在 (この種の) SIMD 命令を使用していません。ただし、 Monoでサポートされています。

于 2012-12-07T11:09:54.017 に答える