首先,阅读LinkedIn Engineering 博客上的精彩文章。仔细阅读并检查是否有一些您也可以在您的应用程序中尝试的优化。如果您尝试了所有这些并且仍然没有解决您的性能问题,请继续阅读。
我假设您的页面上有一些图片库或杂志风格的内容区域
把这个图像区域放在一个单独的区域怎么样iframe
?那你可以做的是:
- 有两个 iframe。只有一个应该及时可见并处于活动状态。
将图像加载到第一个 iframe。跟踪加载图像的大小。如果精确尺寸跟踪很难
numberOfLoadedImages * averageImageSize
可能是一个很好的近似值。
- 随着该数字接近某个阈值,开始将当前可见的内容预加载到第二个 iframe 中。
- 翻转 iframe 的可见性,使第二个变为活动状态。
- 清除第一帧的内部内容。
- 根据需要重复整个过程。
我不确定这是否适合您,但我希望 iPad 上的 WebKit 引擎能够独立清除帧的内存。
编辑:原来你正在写一个游戏。
如果这是一款游戏,我假设您希望同时在屏幕上显示许多游戏对象,并且您将无法简单地卸载其中的某些部分。以下是针对该案例的一些建议:
- 不要将 DOM 用于游戏:它太占内存了。幸运的是,您已经在使用
canvas
。
- 精灵你的图像。图片精灵不仅有助于减少请求的数量。它们还可以让您减少
Image
对象数量并降低每个文件的开销。在IE 博客上阅读有关使用 spritecanvas
制作动画的信息。
- 优化您的图像。有几种图像文件大小优化器。Smush它就是其中之一。试试你的图像。请注意Stoyan Stefanov 在 YUI 博客上的这个伟大系列中讨论的其他技术。
- 尝试矢量图形。SVG 很棒,canvg可以在画布上绘制它。
- 尝试简化您的游戏世界。也许一些背景对象不需要那么详细。或者,也许您可以为他们使用更少的精灵。或者,您可以为同一组的不同对象使用图像过滤器和蒙版。就像 Dave Newton 所说的 iPad 是一个非常受限制的设备,你很可能会得到质量相对较低的精灵。
这些都是与减少您必须加载的数据有关的建议。其他一些可能对您有用的建议。
- 预加载您将需要的图像并卸载您不再需要的图像。如果您的游戏有“关卡”或“任务”,则加载仅当前游戏所需的精灵。
- 尝试先加载“流行”图像,然后在后台下载剩余的图像。您可以为此使用单独
<iframe>
的,这样您的主游戏循环就不会被下载中断。您还可以使用跨框架消息传递来协调您的下载框架。
- 您可以将最受欢迎的图像存储在
localStorage
和Application Cache
中WebSQL
。他们每个可以为您提供 5 mb 的存储空间。这对你来说是15 兆的持久缓存。请注意,您可以将类型化数组用于localStorage
和WebSQL
。还要记住,这Application Cache
很难使用。
- 尝试将您的游戏打包为 PhoneGap 应用程序。通过这种方式,您可以避免用户在玩游戏之前下载大量数据。单次下载 200 兆只是为了打开一个页面,实在是太多了。大多数人甚至不会费心等待。
除此之外,您最初建议用图像覆盖缓存实际上是有效的。只是不要马上去做。探索减少游戏下载大小的可能性。