2012-06-10 3 views
2

그래서 간단한 게임을 위해이 코드를 작성했습니다. 이 코드는 Chrome과 Safari에서 모두 60fps로 실행되지만 Firefox는 거의 30-40fps를 관리합니다. 이 코드는 충분히 간단합니다. 지연의 원인은 무엇입니까?이 코드는 왜 Firefox에서 느리게 실행됩니까?

나는 방화 광경을 점검하고 "따라 가기"기능 만 항상 사용하고 있다는 것을 알아 냈습니다. 여기

function checkCollision (ball0, ball1) { 
    var dx = ball1.X - ball0.X, 
     dy = ball1.Y - ball0.Y, 
     dist = Math.sqrt(dx * dx + dy * dy); 

    if (dist < ball0.rad + ball1.rad) { 
     var angle = Math.atan2(dy, dx), 
      sin = Math.sin(angle), 
      cos = Math.cos(angle); 

      var pos0 = {x: 0, y: 0}, 
      pos1 = rotate(dx, dy, sin, cos, true), 
      vel0 = rotate(ball0.spdX, ball0.spdY, sin, cos, true), 
      vel1 = rotate(ball1.spdX, ball1.spdY, sin, cos, true), 
      vxTotal = vel0.x - vel1.x; 
     vel0.x = ((ball0.mass - ball1.mass) * vel0.x + 2 * ball1.mass * vel1.x)/
       (ball0.mass + ball1.mass); 
     vel1.x = vxTotal + vel0.x; 
     var absV = Math.abs(vel0.x) + Math.abs(vel1.x), 
      overlap = (ball0.rad + ball1.rad) - Math.abs(pos0.x - pos1.x); 
     pos0.x += vel0.x/absV * overlap; 
     pos1.x += vel1.x/absV * overlap; 
     //rotate positions back 
     var pos0F = rotate(pos0.x, pos0.y, sin, cos, false), 
      pos1F = rotate(pos1.x, pos1.y, sin, cos, false); 
     ball1.X = ball0.X + pos1F.x; 
     ball1.Y = ball0.Y + pos1F.y; 
     ball0.X = ball0.X + pos0F.x; 
     ball0.Y = ball0.Y + pos0F.y; 
     var vel0F = rotate(vel0.x, vel0.y, sin, cos, false), 
      vel1F = rotate(vel1.x, vel1.y, sin, cos, false); 
     ball0.spdX = vel0F.x; 
     ball0.spdY = vel0F.y; 
     ball1.spdX = vel1F.x; 
     ball1.spdY = vel1F.y; 
    } 
} 

function move() 
{ 
    var side,i; 
    for (i=0 ; i < balls.length; i++) 
    { 
     var obj = balls[i]; 
     if (side=obj.edgeX()) 
     { 
      if (side === 'l') 
       obj.X = obj.rad; 
      else if (side === 'r') 
       obj.X = canvas.width() - obj.rad; 
      obj.spdX*=-1; 
     } 
     if (side=obj.edgeY()) 
     { 
      if (side === 't') 
       obj.Y = obj.rad; 
      else if (side === 'b') 
       obj.Y = canvas.height() - obj.rad; 
      obj.spdY*=-1; 
     } 

     if (leash == true && i === 0) 
     { 
      if (mouse.X>obj.X && (obj.spdX<10)) 
       obj.spdX+=obj.accX; 
      else if (mouse.X<obj.X && (obj.spdX>-10)) 
       obj.spdX-=obj.accX; 
      if (mouse.Y>obj.Y && (obj.spdY<10)) 
       obj.spdY+=obj.accY; 
      else if (mouse.Y<obj.Y && (obj.spdY>-10)) 
       obj.spdY-=obj.accY; 
     } 


     obj.X+=obj.spdX; 
     obj.Y+=obj.spdY; 
     if (Math.abs(obj.spdX)>0.1) 
      obj.spdX*=0.98; 
     else obj.spdX=0; 
     if (Math.abs(obj.spdY)>0.1) 
      obj.spdY*=0.98; 
     else obj.spdY = 0; 
    }; 
} 

function follow() 
{ 
    var ballA, i, ballB,j; 
    requestAnimationFrame(follow); 
    //stats.begin(); 
    context.clearRect(0,0,canvas.width(),canvas.height()); 

    move(); 
    for (i = 0, len = balls.length - 1; i < len; i++) { 
      ballA = balls[i]; 
      for (j = i + 1; j < balls.length; j++) { 
      ballB = balls[j]; 
      checkCollision(ballA, ballB); 
      } 
    } 
    balls.forEach(function(obj){ 
     drawCircle(obj.X,obj.Y,obj.rad, obj.color); 
     if (leash == true && obj.control === true) 
     {drawLeash(mouse.X,mouse.Y,obj.X,obj.Y,obj.color);} 
    }); 
    //stats.end(); 
}; 

애니메이션입니다 : 다음은 코드가 http://ipsumturpis.xtreemhost.com/follower/index.html

+0

http://ipsumturpis.xtreemhost.com/follower/index.html의 페이지에는 통계 개체가 없기 때문에 죽습니다. 문제가있는 작업 페이지가 표시 될 가능성이 있습니까? –

+0

링크와 문제가 수정되었습니다. 다시 확인하십시오 – ArsalanDotMe

+0

흠. fps를 어떻게 측정합니까? Eyeballing, 그것은 파이어 폭스와 크롬에서 동일하게 보인다. –

답변

2

왠지이 기억 캔버스 그리기 성능에 대한 FF에서 문제가 될하는 데 사용, 그래서 drawCircle(obj.X,obj.Y,obj.rad, obj.color);하고 휙를 주석 한 마법이 일어 - 내 프레임 속도가 11 FPS에서 60까지 올라갔습니다.

1

공에서 길이를 캐싱 해보십시오. 내가 볼 수없는 이유 때문에 절대적으로 필요한 경우가 아니라면 루프의 모든 반복에서 balls.length (또는 함수)를 실행하면 당연히 시간이 많이 걸릴 것입니다.

이렇게 시도해보십시오.

ballslen = balls.length; 
for (j = i + 1; j < ballslen; j++) 
관련 문제