2013-01-24 2 views
4

HTML5 캔버스에는 명시 적으로 단일 픽셀을 설정하는 방법이 없습니다.HTML5 캔버스의 픽셀 설정 최적화

  • 사용 getImageDataputImageData하지만 효율성으로 인해 rect 또는 같은 putImageData

  • 사용 무거운 물체의 낮은 성능 애니메이션 너무 낮 :

    내가 지금까지 알고있는 솔루션입니다 putImageData 하나의 픽셀을 그릴 수 있지만 그릴 픽셀이 많이있을 때 성능이 훨씬 나빠진 것 같습니다.

나는 우리가 drawImage(new Image(w,h))에 의해 putImageData를 교체 할 경우 drawImage 기능은 정말 빨리 putImageData 보다 실제로는 것을 보았다, 정말 빠릅니다. 그러나 나는 픽셀 단위로 빠르게 설정 될 수있는 drawImage의 인수에 이미지를 넣는 해결책을 모른다.

그녀의 느린 코드의 예입니다

HTML :

<canvas id="graph1" width="1900" height="1000"></canvas> 

자바 스크립트 :

var canvas=document.getElementById("graph1"), 
     ctx=canvas.getContext("2d"), 
     imageData, 
     data, 
     w=canvas.width, 
     loop=0, 
     t=Date.now(); 

    window.requestAnimFrame = (function(callback) { 
     return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || 
     function(callback) { 
      window.setTimeout(callback, 1000/60); 
     }; 
     })(); 


    function animate() { 
     imageData=ctx.createImageData(w, canvas.height); 
     data=imageData.data; 
     for(i=0;i<30000;i++) { // Loop fast enough 
      x=Math.round(w*Math.random()); 
      y=Math.round(canvas.height*Math.random()); 
      data[((w * y) + x) * 4]=255; 
      data[((w * y) + x) * 4+1]=0; 
      data[((w * y) + x) * 4+2]=0; 
      data[((w * y) + x) * 4+3]=255; 
     } 
     ctx.putImageData(imageData, 0, 0); //Slow 
     //ctx.drawImage(new Image(canvas.width, canvas.height),0,0);// Would be about 4x faster even if ImageData would be also blank 

     requestAnimFrame(function() { 
       loop++; 
       if(loop<100) 
        animate(); 
       else 
        alert('finish:'+(Date.now()-t)); 
      }); 
    } 
    animate(); 

사람이 성능을 향상시킬 수있는 단서가있는 경우

.

+0

fillRect (x, y, 1,1)로 픽셀을 넣으려고 했습니까? – GameAlchemist

+0

이 메시지를 작성한 이후로 브라우저가 진화했을 수도 있지만, 당시 rect 객체를 사용하여 테스트 한 결과 모든 솔루션보다 훨씬 최악이었습니다. – Hentold

답변

0

putImageData (html5 캔버스를 계획하는 경우) 무엇을 사용 하시겠습니까? 그것은 drawImage만큼 빠릅니다.

drawImageputImageData 방법 모두 유사한 이미지를 사용하여 다시 칠해도 결국 같은 속도가됩니다. 완전히 임의의 픽셀의 페인트 속도를 비교하고 계속해서 빈 페이지를 다시 그리는 것입니다. 이 증거가 필요하다면 예를들 수 있습니다.

+0

나는 그걸 전혀 모른다. http://jsperf.com/buffering에서 살펴볼 수 있습니다. 'drawImage'는'putImageData'보다 약 100 배 빠릅니다. 그리고 내 샘플에서 'ctx.putImageData (...)'줄을'ctx.drawImage (...)'줄로 바꾸면 빈 이미지라도 스크립트가 더 빨라진다는 것을 알 수있다. 이 예제는 애니메이션의 유창성을 향상시키기에 충분할 것입니다.) 브라우저가'putImageData'를 위해서가 아니라'drawImageData'를 위해 최적화 된 방식으로 참으로 이상합니다. – Hentold

+0

http://jsfiddle.net/DEw3b/1/ 이것은 내 컴퓨터 중 하나에서 동일하지만 흥미는 없습니다. 다른. 어떤 경우에도 끌기가있는 단일 픽셀을 수행 할 수 없습니다. 그래서 그렇게 중요하지 않습니다. –