在html上快速加载许多图像
Fast Loading of many images on html
我正在编写一个脚本,用户在其中选择一系列数据,然后我从服务器中获取一堆图像(超过150张),然后循环使用它们来制作类似电影的东西。我想知道的是,在图像中移动时,加载防止滞后的最有效方法。
目前,我正在使用Ajax从服务器获取图像,并将它们存储在JavaScript上的一组Image对象中。在HTML中,我有一个div标记,我希望在其中放置图像。在我完成了在数组中创建所有Image对象(并设置了正确的src)之后,我执行以下操作:
imgElem = document.createElement('img');
document.getElementById('loopLocation').appendChild(imgElem);
imgElem.src = images[0].src;
在这之后,我只进行最后一次调用,但更改了循环索引。我每400毫秒做一次。循环是有效的,但有时它会滞后,在图像上冻结的时间比预期的要长。我想知道我是否能够从客户端改进这一点,或者我只需要一个响应更快的服务器。
您可能需要考虑spriting,它将所有图像放在一个大图像中。这样,您只需要加载一个大图像,然后为每个场景重新定位即可。
或者,在实际使用之前,您可能还想预加载这150个图像。您可以使用JS数组来存储Image对象,然后循环使用该数组来获取图像。
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));
}
循环会阻塞UI线程。JS是单线程的,这意味着代码以线性方式一个接一个地执行。该循环语句之后的任何内容都将等待循环结束。如果这个循环需要很长时间。。。喝点咖啡。另外,由于您正在操作DOM,因此由于UI线程被阻塞,您看不到任何更改。
但有一些方法可以绕过这一点,其中之一是在JS不忙的时候使用超时来延迟和排队代码,以便稍后执行。
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);
我同意Joseph的第二点。这里有一个很好的链接,可以在开始循环之前完成图像预加载:http://www.javascriptkit.com/javatutors/preloadimagesplus.shtml
- 如何使用url加载程序在webpack中导入多个图像
- 如何在生成下载文件时显示加载动画
- 有没有任何方法可以将控制器从文件加载到ui路由器$stateProvider中
- 无法在通过jQuery的ajax加载的页面中执行javascript
- Emberjs应用程序加载在除Index之外的所有路由上
- 在GWT中高效地从服务器加载许多图像
- 谷歌地图API加载缓慢,有许多标记
- 许多请求在页面加载时(需要.js)
- 加载许多 svg 文件并更改填充
- 在html上快速加载许多图像
- 在Javascript Windows应用商店中加载许多音频文件
- 正在加载许多javascript文件
- MVC3在视图中预加载许多图像
- 在ExtJS中加载许多数据
- 最快的方式来加载许多js文件和变量
- Javascript iframe加载时间函数的许多url
- 在Meteor中加载具有许多订阅的小块数据
- 如何在HTML文件的头文件中包含一个加载了许多javascript的通用文件
- 许多图像加载性能HTML/Javascript
- Javascript:从没有base64-dataURL的自定义API将许多图像加载到DOM中