如何提高我的javascript碰撞模拟效率?

时间:2018-07-12 08:49:28

标签: javascript performance collision-detection complexity-theory

我正在尝试改进我的碰撞仿真代码。 例如,让我们以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倍,我仍然很高兴。

谢谢

0 个答案:

没有答案