3

X 個のパーティクルを含むパーティクル システムがあります。各パーティクルは、他のパーティクルとの衝突をテストします。これにより、フレームごとに X*X = X^2 の衝突テストが得られます。60f/s の場合、これは 1 秒あたり 60*X^2 の衝突検出に相当します。

これらの集中的な計算に対する最良の技術的アプローチは何ですか? F#、C、C++、C#、またはその他を使用する必要がありますか?

以下は制約です

  1. コードは最新の XNA を使用して C# で記述されています
  2. マルチスレッドが考慮される場合があります
  3. 最も近い隣人との衝突をテストしたり、問題を軽減したりする特別なアルゴリズムはありません

最後の制約は変かもしれないので説明させてください。制約 3 に関係なく、莫大な計算要件を伴う問題が与えられた場合、問題を解決するための最良のアプローチは何でしょうか。アルゴリズムが問題を軽減します。同じアルゴリズムでも、テクノロジによって動作が異なる場合があります。CLR とネイティブ C の長所と短所を検討してください。

4

4 に答える 4

2

簡単な答えは「それを測定する」です。しかし、このグラフを見てください(私はこの質問から借りました-これは読む価値があります)。

グラフ

C ++は、MSのC#実装(この特定の計算の場合)よりもおそらく10%速く、MonoのC#実装に対してはさらに高速です。しかし、現実の世界では、C ++はC#よりもはるかに高速ではありませ

筋金入りの数値計算を行う場合は、CPUのSIMD / SSEユニットを使用することをお勧めします。これはC#が通常サポートしていないものですが、Monoはthroughのサポートを追加していMono.Simdます。グラフから、SIMDユニットを使用すると、両方の言語のパフォーマンスが大幅に向上することがわかります。

(C ++はC#よりも「高速」ですが、使用するハードウェアの選択と比較して、言語の選択によるパフォーマンスへの影響はわずかです。コメントで述べたように、アルゴリズムの選択により、圧倒的に最大の効果。)

そして最後に、Jerry Coffinが彼の回答で述べたように、GPUで処理を行うこともできます。SIMDよりもさらに高速になると思います(ただし、私が言ったように、測定してください)。GPUを使用すると、CPUを他のタスクに自由に使えるようにするという追加の利点があります。欠点は、エンドユーザーが妥当なGPUを必要とすることです。

于 2010-10-29T01:57:18.170 に答える
2

おそらく、CUDA、OpenCL、または DirectX 計算シェーダーなどを使用して GPU でこれを行うことを検討する必要があります。

于 2010-10-28T18:18:57.100 に答える
1

Sweep and prune は、このタスクに適した広範なフェーズの衝突検出アルゴリズムです。時間的な一貫性を利用できる場合、フレーム間の位置の違いは一般的に小さく、処理の削減が得られる可能性があります。このテーマに関する優れた本は、「リアルタイムの衝突検出」です。

于 2010-10-29T08:57:18.847 に答える
0

簡単なスピードアップのために、最初に1つの軸でソートし、完全なチェックを行う前にその軸の衝突をチェックすることをループすることができます...各粒子について、そうでないものが見つかるまで配列をさらに調べるだけで済みますその軸で衝突すると、次の軸に移動できます。

于 2010-12-29T19:48:50.257 に答える