Canvas甚至Img吃RAM和CPU

时间:2011-11-20 19:27:50

标签: javascript memory google-chrome canvas html5-canvas

我正在收集该地区丢弃的文件列表。然后获取他们的dataUrl并将它们放入Img中。然后使用drawImage将该图像放入画布中。我根据尺寸适当缩放图像。它运作正常。但问题是即使在手术完成后也是如此。例如在Canvas附加到dom CPU并且内存使用率很高之后很久。只是为了显示画布需要高CPU和内存。

放弃事件中的代码:

    e.preventDefault();
    $("#controller_search").attr('value', '^')
    $("#controller_search").attr('disabled', 'disabled');
    $("#imageList").html('');
    var templateData = "\
        <div class='imageviewer-up'> \
            <div class='curtain'></div> \
            <canvas class='canvas'></canvas> \
            <div class='loading'>0%</div> \
        </div> \
        ";
    for(var i=0;i<event.dataTransfer.files.length;++i){
        var file = event.dataTransfer.files[i];
        var reader = new FileReader();
        reader.onload = (function(file){
            return function(e){
                var template = $(templateData);
                var image = new Image();/*template.find('img')[0];*/
                image.onload = (function(image){
                    return function(){
                        var size = {height: image.height, width: image.width}
                        var rSize = size;
                        if(size.height > 175)
                            rSize = {height: 175, width: (175*size.width)/size.height}
                        else{
                            rSize = {height: 175/(size.width/size.height), width: size.width/(size.width/size.height)}
                        }
                        image.height = rSize.height;
                        image.width = rSize.width;

                        var canvas = template.find('canvas')[0];
                        var context = canvas.getContext("2d");
                        context.mozImageSmoothingEnabled = true;
                        canvas.height = 175+4;
                        canvas.width = image.width+4;
                        context.drawImage(image, (canvas.height-image.height)/2, 2, image.width, image.height);

                        template.css('height', 175+4+0);
                        template.css('width', image.width+0);

                    }
                })(image)
                image.src = e.target.result;
                image.title = file.name;
                console.log(file.name);
                $("#imageList").append(template);
                image = null;
            }

        })(file);
        reader.readAsDataURL(file);
    }

目前我正在测试拖动20张图片(总计最多45 MB),因此创建了20张画布。那太多了吗?

修改

我甚至测试过使用IMG而不是画布。例如仅使用IMG和dataUrls。但这种方式也是如此。以同样的方式放慢速度。那么我的代码中是否有任何内存泄漏?

1 个答案:

答案 0 :(得分:4)

我认为这是关于chrome bug#36412的一个问题data:网址会占用内存但不会释放内存。这就是造成潜在问题的原因。我使用window.URL.createObjectURLwindow.URL.revokeObjectURL修复了它。对于webkit而言,window.webkitURL代替。现在它的工作正常,即使有30多个图像。当前代码如下:

for(var i=0;i<event.dataTransfer.files.length;++i){
    var file = event.dataTransfer.files[i];
    var total = event.dataTransfer.files.length;
    var template = $(templateData);
    var image = new Image();/*template.find('img')[0];*/
    image.onload = (function(image, template, i){               
        return function(e){
            /* Size adjustment */               
            var canvas = template.find('canvas')[0];
            var context = canvas.getContext("2d");
            context.drawImage(image, (canvas.height-image.height)/2, 2, image.width, image.height);             
            window.URL.revokeObjectURL(this.src);
        }
    })(image, template, i)
    image.src = window.URL.createObjectURL(file);
    bong.upload.files.push(file);
    $("#imageList").append(template);
    image = null;
}