我有一个带有X粒子的粒子系统。 每个粒子测试与其他粒子的碰撞。这给出了每帧X * X = X ^ 2碰撞测试。对于60f / s,这相当于每秒60 * X ^ 2的碰撞检测。
这些密集计算的最佳技术方法是什么?我应该使用F#,C,C ++或C#还是别的什么?
以下是约束
最后一个约束可能很奇怪,所以让我解释一下。 无论约束3如何,考虑到巨大的计算要求的问题,什么是解决问题的最佳方法。 算法可以减少问题;仍然相同的算法可能根据技术而表现不同。考虑CLR与原生C的利弊。
答案 0 :(得分:2)
你应该考虑在GPU上使用CUDA,OpenCL或DirectX计算着色器这样做。
答案 1 :(得分:2)
简单的答案是“衡量它”。但是看看这张图(我从this question借来的 - 这值得你阅读)。
C ++可能比MS的C#实现快10%(对于这个特定的计算),并且对Mono的C#实现更快。但在现实世界中,C ++并非 比C#快得多。
如果您正在进行核心数字运算,则需要使用CPU的SIMD / SSE单位。这是C#通常不支持的东西 - 但Mono正在通过Mono.Simd
添加支持。从图中可以看出,使用SIMD单元可以显着提升两种语言的性能。
(值得注意的是,虽然C ++仍然比C#“更快”,但与选择使用的硬件相比,语言选择对性能的影响很小。正如评论中所提到的 - 您选择的算法到目前为止效果最好。)
最后,正如Jerry Coffin在his answer中提到的那样,你也可以在GPU上进行处理。我想它会比SIMD更快(但正如我所说 - 测量它)。使用GPU可以让CPU自由地执行其他任务。缺点是您的最终用户需要合理的GPU。
答案 2 :(得分:1)
扫描和修剪是一种广泛的相位碰撞检测算法,可能非常适合此任务。如果你可以利用时间相干性,那么从一帧到另一帧,位置差异通常很小,可以获得处理的减少。关于这个主题的好书是“实时碰撞检测”。
答案 3 :(得分:0)
对于一个简单的加速,您可以先按一个轴排序,然后循环检查该轴上的碰撞,然后再进行全面检查...对于每个粒子,您只需要在数组中进一步查看,直到找到一个不会在那个轴上碰撞然后你可以移动到下一个轴。