简体   繁体   English

什么是使用getImageData,javascript,HTML5 canvas来泄漏内存

[英]What is leaking memory with this use of getImageData, javascript, HTML5 canvas

I am working with the 'canvas' element, and trying to do some pixel based manipulations of images with Javascript in FIrefox 4. 我正在使用'canvas'元素,并试图在FIrefox 4中使用Javascript对图像进行一些基于像素的操作。

The following code leaks memory, and i wondered if anyone could help identify what is leaking. 以下代码泄漏内存,我想知道是否有人可以帮助识别泄漏的内容。

The images used are preloaded, and this code fragment is called once they are loaded (into the pImages array). 使用的图像是预加载的,一旦加载(进入pImages数组),就会调用此代码片段。

    var canvas = document.getElementById('displaycanvas');
    if (canvas.getContext){
        var canvasContext = canvas.getContext("2d");
        var canvasWidth = parseInt(canvas.getAttribute("width"));
        var canvasHeight = parseInt(canvas.getAttribute("height"));

        // fill the canvas context with white (only at start)
        canvasContext.fillStyle = "rgb(255,255,255)";
        canvasContext.fillRect(0, 0, canvasWidth, canvasHeight);

        // for image choice
        var photoIndex;

        // all images are the same width and height
        var imgWidth    = pImages[0].width;
        var imgHeight   = pImages[0].height;

        // destination coords 
        var destX, destY;

        // prep some canvases and contexts
        var imageMatrixCanvas               = document.createElement("canvas");
        var imageMatrixCanvasContext        = imageMatrixCanvas.getContext("2d");


        // Set the temp canvases to same size - apparently this needs to happen according 
        // to one comment in an example - possibly to initialise the canvas?
        imageMatrixCanvas.width         = imgWidth;
        imageMatrixCanvas.height        = imgHeight;

        setInterval(function() { 
            // pick an image
            photoIndex = Math.floor(Math.random() * 5);

            // fill contexts with random image
            imageMatrixCanvasContext.drawImage(pImages[photoIndex],0,0);
            imageMatrixData = imageMatrixCanvasContext.getImageData(0,0, imgWidth, imgHeight);

            // do some pixel manipulation
            // ...
            // ...

            // choose random destination coords (inside canvas)
            destX = Math.floor(Math.random() * (canvasWidth - imgWidth));
            destY = Math.floor(Math.random() * (canvasHeight - imgHeight));

            // show the work on the image at the random coords
            canvasContext.putImageData(imageMatrixData, destX, destY);
        }, 500);        
    }

Oh.. mistake. 哦......错了。 The memory lookes OK after few test. 经过几次测试,内存看起来还不错。
But there is another problem. 但还有另一个问题。
The size of used memory by tab process is growing when changing the src property of img elements... 当更改img元素的src属性时,选项卡进程使用的内存大小正在增长...

Src property = canvas.getContext('2d').toDataURL('image/png') (changing each time);

I've tried to "delete img.src", remove node... 我试图“删除img.src”,删除节点...

Changing imageMatrixData = ... to var imageMatrixData = ... might help a bit, but I doubt that is the full story. imageMatrixData = ...更改为var imageMatrixData = ...可能会有所帮助,但我怀疑这是完整的故事。 But as far as i can tell imageMatrixData is a global scope variable that you assign on every interval iteration, and that cannot be healthy especially with a big chunk of data :) 但据我所知, imageMatrixData是一个全局范围变量,你在每个间隔迭代时分配,并且这不可能是健康的,特别是对于大块数据:)

I know that getImageData used to memoryleak in Chrome but that was pre version 7, not sure how it is now, and seeing as you are talking about ff4 then that is probably very irrelevant. 我知道getImageData用于在Chrome中使用memoryleak,但那是7版之前的版本,不知道它现在是怎样的,并且看到你在谈论ff4时那可能是非常无关紧要的。

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

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