Setting img.src to dataUrl Leaks Memory

后端 未结 5 896
萌比男神i
萌比男神i 2021-01-02 04:16

Below I\'ve created a simple test case that shows that when an img tag\'s src is set to different dataUrls, it leaks memory. It looks like the image data is never unloaded a

5条回答
  •  半阙折子戏
    2021-01-02 05:15

    Panchosoft's answer solved this for me in Safari.

    This workaround avoids the memory increase by bypassing the leaking Image object.

    // Methods to address the memory leaks problems in Safari
    var BASE64_MARKER = ';base64,';
    var temporaryImage;
    var objectURL = window.URL || window.webkitURL;
    
    function convertDataURIToBlob(dataURI) {
        // Validate input data
        if(!dataURI) return;
    
        // Convert image (in base64) to binary data
        var base64Index = dataURI.indexOf(BASE64_MARKER) + BASE64_MARKER.length;
        var base64 = dataURI.substring(base64Index);
        var raw = window.atob(base64);
        var rawLength = raw.length;
        var array = new Uint8Array(new ArrayBuffer(rawLength));
    
        for(i = 0; i < rawLength; i++) {
            array[i] = raw.charCodeAt(i);
        }
    
        // Create and return a new blob object using binary data
        return new Blob([array], {type: "image/jpeg"});
    }
    

    then, in the processImage rendering loop:

    // Destroy old image
    if(temporaryImage) objectURL.revokeObjectURL(temporaryImage);
    
    // Create a new image from binary data
    var imageDataBlob = convertDataURIToBlob(imageData);
    
    // Create a new object URL
    temporaryImage = objectURL.createObjectURL(imageDataBlob);
    
    // Set the new image
    image.src = temporaryImage;
    

提交回复
热议问题