Canvas даже Img ест оперативную память и процессор - PullRequest
4 голосов
/ 20 ноября 2011

Я беру список файлов, сброшенных в этом районе.а затем получить их dataUrl и положить их в Img.а затем положить это изображение на холсте, используя drawImage.Я делаю соответствующее масштабирование изображений в соответствии с их размером.Его функционирование должным образом.Но проблема даже после завершения операции.например, долго после того, как Canvas были добавлены к процессору dom, и использование памяти становится высоким.просто чтобы показать холст, требуется высокая загрузка процессора и памяти.

Код внутри события перетаскивания:

    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 МБ), чтобы создать 20 холстов.Это слишком много?

EDIT

Я даже тестировал использование IMG вместо canvas.например, используя IMG только с dataUrls.Но и так тоже.замедляется таким же образом.Так есть ли утечка памяти в моем коде?

1 Ответ

4 голосов
/ 21 ноября 2011

Я думаю, что это проблема с хромом bug#36412 URL-адрес data: занимает память, но не освобождает ее и это вызывает потенциальную проблему. Я исправил это, используя window.URL.createObjectURL и window.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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...