3

我有一个带有 X 粒子的粒子系统。每个粒子测试与其他粒子的碰撞。这给出了每帧 X*X = X^2 碰撞测试。对于 60f/s,这对应于每秒 60*X^2 次碰撞检测。

这些密集计算的最佳技术方法是什么?我应该使用 F#、C、C++ 还是 C#,还是其他什么?

以下是约束

  1. 代码是用最新的 XNA 用 C# 编写的
  2. 可以考虑多线程
  3. 没有测试与最近邻居的碰撞或减少问题的特殊算法

最后一个约束可能很奇怪,所以让我解释一下。不管约束 3,给定一个具有巨大计算需求的问题,解决该问题的最佳方法是什么。算法减少了问题;仍然相同的算法可能会因技术而异。考虑 CLR 与原生 C 的优缺点。

4

4 回答 4

2

您可能应该考虑在 GPU 上使用 CUDA、OpenCL 或 DirectX 计算着色器之类的东西来执行此操作。

于 2010-10-28T18:18:57.100 回答
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 回答
1

Sweep and prune 是一种广泛的相位碰撞检测算法,可能非常适合这项任务。如果您可以利用时间相干性,即从帧到帧的位置差异通常很小,则可以减少处理。关于该主题的一本好书是“实时碰撞检测”。

于 2010-10-29T08:57:18.847 回答
0

为了简单的加速,您可以先按一个轴排序,然后循环检查该轴上的碰撞,然后再进行全面检查...对于每个粒子,您只需要在数组中进一步查看,直到找到一个不存在的粒子在该轴上发生碰撞,然后您可以移动到下一个。

于 2010-12-29T19:48:50.257 回答