【发布时间】:2014-03-07 14:27:37
【问题描述】:
我有一个非常大(如功能丰富的)响应式网站。它由 150 多个不同的 UI 页面组成,到目前为止,在移动设备上的渲染和性能都很好(我使用 iPhone5 进行测试,偶尔使用其他设备)。
除了一页,我现在正在编码。这是临时开发 URL:
http://www.jungledragon.org/apps/jd3/daylight
在 Mobile Safari 上,此页面的性能极差: - 加载需要几秒钟,比所有其他页面慢得多 - 加载后,触摸滚动可能需要 5-10 秒才能完成任何操作 - 移动 Safari 整体变得无响应或接近它
我正在尝试解决问题的根本原因,但到目前为止还没有成功。我无法在任何使用小视口的桌面浏览器上重现这一点,甚至在桌面 Safari 上也无法重现。在桌面上,我检查了几个 Web 调试器以检查是否有任何长时间运行的进程,但没有发现。
关于页面功能的一些解释:
- 它将尝试检测您的当前位置(使用我发现的警报,这需要很少的时间)
- 根据您当前的位置和当前日期,它将计算当天的太阳时间。这也几乎是即时的
- 根据suntimes动态生成表格,最后显示在屏幕上
这是我在移动 Safari 上看到的详细信息:
- 服务器响应很好,页面加载很快,很快就会显示站点标题
- 接下来,内容正文为空白,并保持空白几秒钟(我无法解释)
- 最后,渲染了 suntimes 表。
- 这完成了页面,但到目前为止,页面和浏览器都非常缓慢,滚动需要很长时间,并且 Safari 控件几乎没有响应。它的外观和感觉就像浏览器随时可能崩溃一样。
根据我迄今为止的研究,并鉴于网站上所有其他页面的良好性能,我完全不知道是什么原因造成的。
编辑:我使用 BrowserStack 做了一些测试:
- iPhone 4S:没问题
- iPhone 5S:没问题
- 银河 SII:没问题
- HTC One X:没问题
- iPhone 5:与上述相同的问题
所以我在任何桌面浏览器上都没有看到这个问题,在除 iPhone 5 (iOS7) 之外的任何移动设备上都没有。
Edit2:根据收到的 cmets 添加更多发现和解释:
这个问题似乎与动画无关。为此,我有许多证明点。一个简单的证明点是该页面没有进行任何视觉渲染,这与网站上没有性能问题的其他 100 多个页面有很大不同。
可以通过了解此特定页面中发生的情况来解释第二个证明点。会发生什么:
系统会检测当前用户的时间和位置。现在假设用户实际上允许位置共享。使用一个简单的警报,我已经能够证明位置检测不是瓶颈。
根据用户的时间和位置,计算日光时段。这是通过使用 Suncalc JS 库 (https://github.com/mourner/suncalc) 完成的。
Suncalc 库返回给定日期和位置的日光时段数组。我将该数组呈现为具有彩色背景行的表格。就是这样。
渲染具有 12 行和不同背景颜色的表格不太可能导致如此大的问题。因此,我的理论在于第 2 步是根本原因。 Suncalc 库中有很多高级数学。我在想(还没有证据)我的移动处理器在这类操作上很糟糕,和/或特定计算由于某种原因导致内存使用达到峰值(甚至是泄漏)。
作为一个额外的证明点:在移动设备上加载页面后,使用日期旁边的向右箭头导航到“明天”。您将再次看到极其糟糕的性能。在这一步中,没有网络活动,没有位置检测,什么都没有,只有计算和一些非常简单的渲染。这验证了我的理论,即问题可能出在计算上。
【问题讨论】:
-
仅供参考,我将它加载到我的 Galaxy SIII 上的 Chrome 应用程序中,并注意到您描述的相同问题。我想知道它是否与JS引擎有关? Chrome 使用 Blink(WebKit 的一个分支),不确定 Mobile Safari 使用什么。
-
您在此处制作的动画是否比在其他网页上多?操作(通过动画)多个 DOM 元素通常会削弱移动设备,您甚至不会在任何现代桌面上注意到它(无论分辨率如何)。这将是我要看的第一个地方,并且可能将所有内容都移到 requestAnimationFrame 中。即便如此,您仍需要注意有多少元素通过直接 JS 或级联转换进行动画处理。
-
@CullenJ 感谢您的测试!请参阅我更新的问题以获得一些解释。
-
@MattPileggi 请看我更新的问题,我相信问题可能是计算,而不是动画。
-
我通过分析器运行该页面,但没有看到任何繁重的计算负载。
标签: iphone responsive-design mobile-safari