Javascript 在加载 200mb 的新 Images() 后在 Safari / iPad2 中运行缓慢.为什么
Javascript runs slowly in Safari / iPad2 after loading 200mb worth of new Images(). Why might this be?
有谁知道为什么Javascript的性能会受到将大量外部JPG/PNG图像加载到HTML5 Image((对象中的影响,总计约为200Mb-250Mb。即。如果以前浏览的缓存已满(-ish(,则当前站点的性能会大大降低。
有2个说我可以粗略地解决它。
- 手动清除缓存。
- 最小化浏览器,等待大约 20 秒并重新打开浏览器,之后 iOS/浏览器已回收内存并按预期运行 JS。
我本来希望iOS回收运行当前任务所需的内存,但似乎并非如此。另一种解决方法是将 200Mb 的"缓存清除"图像加载到 Image(( 对象中,然后通过设置src = ""
来删除这些图像。这似乎确实有帮助,但它不是一个优雅的解决方案......
请帮忙?
首先阅读LinkedIn工程博客上的优秀文章。仔细阅读并检查是否有一些也可以在应用程序中尝试的优化。如果您尝试了所有这些方法,但仍未解决性能问题,请继续阅读。
我假设您的页面上有一些图片库或杂志风格的内容区域
如何将此图像区域放在单独的iframe
中?然后你可以做的是:
- 有两个内嵌框架。只有一个应该在时间上可见并处于活动状态。
-
将图像加载到第一个 iframe 中。跟踪加载图像的大小。如果难以跟踪确切的尺寸
numberOfLoadedImages * averageImageSize
可能是一个很好的接近。
- 当这个数字接近时,一些 thresshold 开始将当前可见的内容预加载到第二个 iframe 中。
- 翻转 iframe 的可见性,使第二个窗口变为活动状态。
- 清除第一帧的内部内容。
- 根据需要重复整个过程。
我不确定这是否适合您,但我希望 iPad 上的 WebKit 引擎能够独立清除帧的内存。
编辑:原来你正在写一个游戏。
如果这是一个游戏,我假设您希望同时在屏幕上显示许多游戏对象,并且您无法简单地卸载它们的某些部分。以下是针对这种情况的一些建议:
- 不要在游戏中使用 DOM:它太占用内存了。幸运的是,您已经在使用
canvas
了。 - 对图像进行精灵处理。图像精灵不仅有助于减少请求数量。它们还允许您减少
Image
对象的数量,并降低每个文件的开销。在 IE 博客上阅读有关使用精灵制作canvas
动画的信息。 - 优化您的图像。图像有几个文件大小优化器。SmushIt就是其中之一。为您的图像尝试一下。注意Stoyan Stefanov在YUI博客上讨论的其他技术。
- 尝试矢量图形。SVG很棒,canvg可以在画布上绘制它。
- 尝试简化您的游戏世界。也许某些背景对象不需要那么详细。或者,也许您可以为他们减少精灵。或者,您可以对同一组的不同对象使用图像滤镜和蒙版。就像戴夫·牛顿(Dave Newton(所说的那样,iPad是一种非常受限的设备,你很有可能可以侥幸使用质量相对较低的精灵。
这些都是与减少必须加载的数据有关的建议。其他一些可能适合您的建议。
- 预加载需要的图像,卸载不再需要的图像。如果您的游戏有"关卡"或"任务",则加载当前精灵所需的精灵。
- 尝试先加载"流行"图像,然后在后台下载剩余的图像。您可以为此使用单独的
<iframe>
,这样您的主游戏循环就不会因下载而中断。您还可以使用跨帧消息传递来协调下载程序帧。 - 您可以将最流行的图像存储在
localStorage
、Application Cache
和WebSQL
中。他们每个人都可以为您提供5 mb的存储空间。这对您来说是 15 兆的持久缓存。请注意,您可以将类型化数组用于localStorage
和WebSQL
。还要记住,Application Cache
很难使用。 - 尝试将您的游戏打包为 PhoneGap 应用程序。通过这种方式,您可以避免用户在玩游戏之前下载大量数据。200 megs 作为一次下载只是为了打开一个页面太多了。大多数人甚至懒得等待。
除此之外,您最初建议用图像覆盖缓存实际上是有效的。只是不要马上做。探索减小游戏下载大小的可能性。
我设法通过将当前不在视口中的所有图像设置为显示:none来减少影响。这是背景图像,但我还没有测试超过 100Mb 的图像,所以不能说这是否真的有帮助。但绝对值得一试。
- 在Safari执行javascript之前对其进行修改
- Safari(Mac OS)上的jQuery平滑滚动问题
- $(document).height()在刷新时随机化值(Safari 5.1.10)
- jQuery Datepicker可以在Safari中工作,但不能在FF或Chrome中工作
- document.applet.method在Mounatin Lion上抛出safari 6+JDK7异常
- 主干网.与Safari同步问题
- jQuery表单验证适用于Mozilla和Internet Explorer,但不适用于Chrome或Safari
- 以编程方式选择文本Mobile Safari
- onbeforeunload和asp:Safari和FireFox中的更新面板
- 为什么我的JavaScript在Safari上的严格模式下不能正常工作
- 防止在移动Safari(iPad/iPhone)中长按/长按默认上下文菜单
- 如何在关闭窗口之前在Safari扩展中捕获窗口关闭
- safari扩展中的重定向url
- JS代码在jsbin中有效,在jsfiddle或Chrome/Safari中无效
- SQLite插件适用于Mac和Windows,但不适用于手机上的Safari
- window.open(url).print()在Safari中不起作用
- Javascript 在加载 200mb 的新 Images() 后在 Safari / iPad2 中运行缓慢.为什么
- 需要.js - 在 safari ipad2 上“无定义呼叫”
- javascript getAttribute()没有'无法在iPad2 Safari上工作
- 在iPad2上的Safari中动态加载图像会导致内存泄漏