Fast Loading of many images on html

前端 未结 2 1244
栀梦
栀梦 2020-12-17 05:11

I am coding a script in which the user selects a range of data, and then I fetch a bunch of images (over 150) from the server and then I loop trough them to make something

相关标签:
2条回答
  • 2020-12-17 05:36

    I agree with Joseph on his second point. Here's a nice link to accomplish image preloading before you start the loop: http://www.javascriptkit.com/javatutors/preloadimagesplus.shtml

    0 讨论(0)
  • 2020-12-17 05:40

    you might wanna consider spriting which is putting all images into one big image. with this, you only need to load one big image, and then just reposition for every scene.

    or, you might also want to pre-load those 150 images, before actually using them. you can use JS array to store Image objects and then loop through that array to get your images.

    var images = [];
    var expectLoaded = 150;
    
    for(var i = 0; i<expectLoaded;i++){
        (function(i){
    
            //new image object
            var img = new Image();
    
            //onload hander
            img.onload = function(){
    
                //after load, push it into the array
                images.push[img];
    
                //and check if the all has loaded
                if(images.length === expectLoaded){
                    //preload done
                }
            }
    
            //start loading this image
            img.src = //path to image[i];
    
        },(i));
    }
    

    loops block the UI thread. JS is single-threaded, meaning code gets executed in a linear fashion, one after the other. anything that comes after that loop statement will wait until the loop finishes. if that loop takes long... grab some coffee. plus, since you are manipulating the DOM, you don't see the changes since the UI thread is blocked.

    but there are ways to bypass this, and one of them is using timeouts to delay and queue the code for later execution, when JS is not busy.

    function animate(frameNo){
    
        //animate frame[frameNo];
    
        if(frameNo < total_frames){    //make the UI breate in between frames
            setTimeout(function(){   //so that changes reflect on the screen
                animate(++frameNo);  //then animate next frame
            },200);                  
        }
    }
    
    //start
    animate(0);
    
    0 讨论(0)
提交回复
热议问题