我最近开始使用LWJGL模拟一组恒星体。该解决方案需要每帧执行许多循环迭代。该程序计算每个其他身体施加在每个身体上的力。我不希望实现任何形式的限制,例如树算法。该程序本身能够以大约15 fps的速度模拟800个随机质量体(1到50之间)。这是计算的原始代码,然后更新每个正文的位置。
public void updateAllBodies() {
for (Body b : bodies) {
for (Body c : bodies) {
if (b != c) {
double[] force = b.getForceFromBody(c, G);
b.velocity[0] += force[0];
b.velocity[1] += force[1];
b.velocity[2] += force[2];
b.updatePosition();
}
}
}
}
最近我遇到了并行和流的主题。看到我的原始代码只使用了一个线程,我想我可以通过将数组转换为流来改进性能,并使用
执行它.parallelStream()
我对多线程和并行性知之甚少,但这是我想出的结果代码。
public void updateAllBodies() {
Arrays.asList(bodies).parallelStream().forEach(i -> {
for(Body b: bodies){
if (i != b){
double[] force = i.getForceFromBody(b, G);
i.velocity[0] += force[0];
i.velocity[1] += force[1];
i.velocity[2] += force[2];
i.updatePosition();
}
}
});
}
不幸的是,在执行时,这个新代码产生了与旧代码相同的15 fps。我能够确认有3个并发线程正在运行
Thread.currentThread().getName();
此时,我不知道原因是什么。降低机身数量确实显示出帧速率的急剧增加。任何帮助将不胜感激。
答案 0 :(得分:0)
我似乎无法找到一种方法来将评论标记为帖子的答案,因此我将说明最佳答案是softwarenwebie7331
给出的。