简体   繁体   English

JavaScript:画布上的内存泄漏(不适用于Chrome)

[英]JavaScript: Memory leak on canvas (not in Chrome)

I'm trying to draw some gradient lines on canvas, using jCanvas plugin and jQuery but my code leads to memory leak in Firefox (reserved RAM increases to the infinity). 我正在尝试使用jCanvas插件和jQuery在画布上绘制一些渐变线,但是我的代码导致Firefox中的内存泄漏(保留的RAM增加到无穷大)。 Internet Explorer deals with RAM usage quite good but whole thing is incredibly slow. Internet Explorer可以很好地处理RAM使用情况,但整个过程的运行速度非常慢。 Only Google Chrome displays my canvas without lag. 只有Google Chrome浏览器可以无延迟地显示我的画布。 Could you tell me what am I doing wrong? 你能告诉我我在做什么错吗?

Parts of code: 部分代码:

  • declarations: 声明:

     var i, i1, i2, p; var r=[], g=[], b=[], a=[]; var gradient=[]; var w=$("body").width(); var w2=Math.floor(w/2), w3=w2-1; var h=$("body").height(); 
  • drawing: 画画:

     function draw() { $('#bg').clearCanvas(); for (i=0; i<w2; i++) { $('#bg').drawLine({ strokeStyle: gradient[i], strokeWidth: 2, x1: i*2, y1: 0, x2: i*2, y2: 700, }); } } 
  • recalculating values of lines colours 重新计算线条颜色的值

     function mixer() { for (i=0; i<w2; i++) { p = Math.random(); if (p<0.997) { i1 = (i>1)?i-1:w3; i2 = (i<w3)?i+1:0; r[i] = Math.floor(( r[i1] + r[i2] ) / 2); g[i] = Math.floor(( g[i1] + g[i2] ) / 2); b[i] = Math.floor(( b[i1] + b[i2] ) / 2); } else { r[i] = Math.floor(Math.random()*180); g[i] = Math.floor(Math.random()*180); b[i] = Math.floor(Math.random()*180); } delete gradient[i]; gradient[i] = $("#bg").createGradient({ x1: 0, y1: 0, x2: 1, y2: 699, c1: '#000', c2: "rgb("+r[i]+","+g[i]+","+b[i]+")", c3: '#000' }); } draw(); } window.setInterval(mixer, 60); 

Test if it is better like that: 测试是否更好:

function mixer() {
    for (i = 0; i < w2; i++) {
        p = Math.random();
        if (p < 0.997) {
            i1 = (i > 1) ? i - 1 : w3;
            i2 = (i < w3) ? i + 1 : 0;
            r[i] = Math.floor((r[i1] + r[i2]) / 2);
            g[i] = Math.floor((g[i1] + g[i2]) / 2);
            b[i] = Math.floor((b[i1] + b[i2]) / 2);
        } else {
            r[i] = Math.floor(Math.random() * 180);
            g[i] = Math.floor(Math.random() * 180);
            b[i] = Math.floor(Math.random() * 180);
        }
        delete gradient[i];
        gradient[i] = $("#bg").createGradient({
            x1: 0,
            y1: 0,
            x2: 1,
            y2: 699,
            c1: '#000',
            c2: "rgb(" + r[i] + "," + g[i] + "," + b[i] + ")",
            c3: '#000'
        });
    }
    draw();
    setTimeout(mixer, 60);
}
mixer();

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM