HTML5 캔버스에서 getImageData
/putImageData
을 사용하여 그림을 조작 할 수 있습니다. 내 문제는 브라우저가 결코 free any memory 인 것처럼 보입니다. 탭을 닫을 때까지 (크롬과 오페라에서 테스트 됨).캔버스에 자바 스크립트 메모리 문제가 있습니다.
함수에서 다음을 이전 :
var ctx = document.getElementById('leif').getContext('2d'); var imgd = ctx.getImageData(0,0,width,height); var pix = imgd.data; var rndpixel = 0;
하고 문제가 사라졌다!
function infiniteLeif()
{
for (var i = 0; i<65536; i+=4) {
rndpixel=Math.floor(Math.random()*(width*(height-2))+width+4) * 4;
pix[rndpixel-wx4] = pix[rndpixel]; pix[rndpixel-wx4+1] = pix[rndpixel+1]; pix[rndpixel-wx4+2] = pix[rndpixel+2];
pix[rndpixel+wx4] = pix[rndpixel]; pix[rndpixel+wx4+1] = pix[rndpixel+1]; pix[rndpixel+wx4+2] = pix[rndpixel+2];
pix[rndpixel-4] = pix[rndpixel]; pix[rndpixel-4+1] = pix[rndpixel+1]; pix[rndpixel-4+2] = pix[rndpixel+2];
pix[rndpixel+4] = pix[rndpixel]; pix[rndpixel+4+1] = pix[rndpixel+1]; pix[rndpixel+4+2] = pix[rndpixel+2];
}
ctx.putImageData(imgd,0,0);
if (go==1) t=setTimeout(infiniteLeif,40);
}
전체 example can be found here (Google 크롬 권장)
같은 효과로 루프를 시도했기 때문에 문제가되는 것은 setTimeout
이 아닙니다.
순환 참조 제거가 종종 핵심이지만 실제로 하나의 순환 참조를 사용한다는 것을 알게되었습니다. JavaScript GC이 작업을 수행 할 수 있도록이 코드를 어떻게 변경할 수 있습니까?
캔버스가 pix 배열을 잡고 있는지 궁금합니다. 캔버스를 해제하기 전에이 값을 null로 설정할 수 있습니다. –
그래, 이상하다. 함수의 끝에서 모든 변수를 nulling하려고합니다. – Nosredna