Chrome脚本内存优化

Script memory optimization for Chrome

本文关键字:优化 内存 脚本 Chrome      更新时间:2023-09-26

我有在html5画布元素像素工作的脚本。Google Chrome(版本:17.0.942.0 dev)有一些奇怪的行为。我对像素有两种操作:

  • 改变特定多边形内像素的色调
  • 像素选择工具

问题是当我改变色调时,该选项卡的内存在每次更改后增长到250MB(有时甚至更多),而不是重置为初始大小。但是当我使用魔杖工具选择时,内存不会增长,它会根据选择的像素数量上升或下降(在我看来这是正常的行为)。请帮我理解为什么第一种情况每改变一次,记忆就会增长。

注:在FF中没有这样的问题,这就是为什么我认为这是chrome特有的"奇怪"行为

下面是色调变化的代码:

function isPointInPoly(poly, pt){
    for(var c = false, i = -1, l = poly.length, j = l - 1; ++i < l; j = i)
        ((poly[i].y <= pt.y && pt.y < poly[j].y) || (poly[j].y <= pt.y && pt.y < poly[i].y))
        && (pt.x < (poly[j].x - poly[i].x) * (pt.y - poly[i].y) / (poly[j].y - poly[i].y) + poly[i].x)
        && (c = !c);
    return c;
}
function changeHue(hue){
    var modifyCanvas = $("#canvas-modify").get(0);
    var modifyContext = modifyCanvas.getContext('2d');
    modifyContext.clearRect(0, 0, modifyCanvas.width, modifyCanvas.height);
    var imageData = $$.mainCanvasContext.getImageData(0, 0, $$.mainCanvasElem.width, $$.mainCanvasElem.height);
    for(var i=0;i<imageData.data.length;i+=4) {
        var p = {x: (i/4)%imageData.width, y: parseInt((i/4)/imageData.width)};
        for(var j=0;j<$$.globalSelection.length;j++){
            var poly = $$.globalSelection[j].slice(0, $$.globalSelection[j].length-1);
            if(isPointInPoly(poly, p)) {
                var hsl = rgbToHsl(imageData.data[i], imageData.data[i+1], imageData.data[i+2]);
                hsl[0] = hue;
                var rgb = hslToRgb(hsl[0], hsl[1], hsl[2]);
                imageData.data[i]   = rgb[0];
                imageData.data[i+1] = rgb[1];
                imageData.data[i+2] = rgb[2];
            } else {
                imageData.data[i]   = 0;
                imageData.data[i+1] = 0;
                imageData.data[i+2] = 0;
                imageData.data[i+3] = 0;
            }
        }
    }
    modifyContext.putImageData(imageData, 0, 0);
}

不只是你。

有关闭和在Chrome与任何画布imageData相关的内存泄漏。

例如:

http://code.google.com/p/chromium/issues/detail?id=51171

http://code.google.com/p/chromium/issues/detail?id=20067

等。

Chromium的问题跟踪策略很奇怪。这些问题并不一定能解决,即使他们关闭了它们。

这可能是webkit的事情,而不是Chrome的事情,但我不能肯定地说。我只能说你自己没有做错任何事。

虽然我们在这里让我说你不应该这样做:

var modifyCanvas = $("#canvas-modify").get(0);
var modifyContext = modifyCanvas.getContext('2d');

每次都是为了性能考虑。