我正在尝试改进我的碰撞仿真代码。 例如,让我们以1000个粒子碰撞为例,目前所有粒子都具有相同的半径。
此代码运行大约一百万次:
for (i = 0; i<particles.length; i++){
for (j = 0; j<particles.length; j++){
if (particles[i] === particles[j]) continue;
if (distanceOf(particle[i], particle[j] < radius*2)) {
Collide(particles[i], particles[j]);
}
}
}
不是很有效。 现在,这段代码可以运行约500,000次:
for (i = 0; i<particles.length; i++){
for (j = i + 1; j<particles.length; j++){
if (particles[i] === particles[j]) continue;
if (distanceOf(particle[i], particle[j] < radius*2)) {
Collide(particles[i], particles[j]);
}
}
}
好得多,但仍然没有效率。 接下来,是一个代码,该代码应通过仅与每个粒子的邻居检查来将检查次数减少到4000,从而大大提高效率。我将屏幕划分为16 * 16个扇区,因此每个给定时刻的每个扇区大约有1000/256 = 4个粒子,因此每个粒子只有4个检查(减去自身,即知道),因此我们得到4000个检查,其工作速度比125倍快最后的500,000个支票代码。 代码是这样的:
for (i = 0; i<particles.length; i++){
let cellNumber = particles[i].cell; //each particle updates a "cell" variable with it's own current cell number by calculating it from it's position.
for (j = 0; j<sector[cellNumber].length; j++){ //sector[] is an array of 256 cells, each one is an array of the indexes of the particles in it.
if (particles[i] === particles[sector[cellNumber][j]]) continue;
if (distanceOf(particle[i], particles[sector[cellNumber][j]] < radius*2)) {
Collide(particles[i], particles[sector[cellNumber][j]]);
}
}
}
它的工作速度应该提高125倍,还是有其他复杂性问题会限制它?如果“仅”快50倍,我仍然很高兴。
谢谢