2014-12-11 3 views
0

) 누군가 turnEvenOld(250, 250) (0.089ms)이 turnEvent(250, 250) (0.447ms)보다 훨씬 빨리 실행되는 이유를 설명 할 수 있습니까? jsperf 테스트 setInterval() vs requestAnimationFrame (

나는 훨씬 빠르고 저렴이 setInterval()보다 실행 된 requestAnimationFrame()를 사용하여 생각?

하여 setInterval() :

var turnEventOLD = function turnEvent(AnX, AnY) { 
    ----VARIABLES---- 
    temp = setInterval(myAnimation1, 1000/60); 
    function myAnimation1() { 
     ----DRAWINGCANVAS------ 
     ----- 
     ----CONDITIONS-------- 
     if (one301 && one401) { 
      clearInterval(temp); 
     } 
    } 
} 

requestAnimationFrame() :

var turnEvent = function turnEvent(AnX, AnY) { 
    ----VARIABLES----- 
    function render() { 
     ----DRAWING CANVAS----- 
     ------ 
     ----CONDITIONS--------- 
     if (one301 && one401) { 
      ---stop requestAnimation-- 
     } 
    } 
    (function animloop(){ 
     ----CONDTION----- 
     requestAnimationFrame(animloop); 
     render(); 
    })(); 
} 
+0

turnEventOLD는 turnEvent가 완료되기 전에 렌더링 호출 (함수를 defering 제외) 아무런 작업을하지 않습니다. 또한 requestAnimationFrame()을 사용하면 초당 60 개 이상의 렌더링을 실행할 수 있으므로 더 많은 CPU를 사용할 수 있습니다. – dandavis

답변

2

RequestAnimation 프레임은 반드시 setInterval을보다 "더 빨리"가 아닙니다. 그것은 실제로 다른 것을합니다. 페이지가 다시 칠 준비가 될 때까지 requestAnimationFrame가 대기하는 동안

setInterval을 밀리 초 주어진 수를 기다립니다. setInterval 호출 시간에 따라 setInterval 대기 시간은 다음 다시 칠 때까지의 시간보다 짧거나 길 수 있습니다.

당신이 페이지를 다시 그리기와 동기화에서 잠재적 인 대신 다음 다시 그리기 전에 시각적 요소를 변경 확실 있도록 애니메이션에 대한 requestAnimationFrame을 사용하는 것이 좋습니다.

+0

성능이나 효율성이 향상되지 않습니다. 이 경우에는 문제가되지 않습니까? –

+1

어느 것이 더 효율적인지는 중요하지 않습니다. 적시에 영상을 바꾸고 있는지 확인하는 것이 중요합니다. 간격이 다시 칠하기보다 빠르면 프레임을 버립니다. 간격이 다시 칠하기보다 느린 경우 프레임이 반복됩니다. 다시 칠하는 속도에 가깝다면 놓친 프레임과 두 배로 된 프레임이 혼합되어 애니메이션이 부드럽게 보이지 않으므로 더 나쁩니다. 일반적으로 약간의 지터가 발생합니다. requestAnimationFrame을 사용하면 정확히 다시 칠한 것을 확인할 수 있습니다. – MarkFuzz

+1

설명해 주셔서 감사합니다 .-). 이제는 목적이 훨씬 낫다는 것을 이해합니다. 결과에 만족합니다. 매일 학습 : 난 그냥 대체 @MarkFuzz D –