我在使用overflow:auto调试div上的性能问题时遇到问题。正如您在下面的图片中看到的那样(并在下面的细分中看到),看起来webview因为没有提供帧而浪费宝贵的时间。
最奇怪的是,相同的内容在两个较旧的设备(Moto G和X 2013,Lollipop 5.1)上滚动非常流畅,但在较新的设备上显示出明显的框架(Moto X 2014(Marshmallow 6.0)和Pixel C(Nougat 7.0))
在990到995ms之间,它会做一些合成,光栅化和gpu的东西。然后它闲置15ms(几乎整个帧),更新层树,然后再等待18ms。
所以我们现在已经错过了~2帧,即使它看起来应该能够提供至少一帧。
然后它会触发一个滚动事件,然后咀嚼与之相关的javascript。这需要大约5毫秒,现在它做了一些绘画和合成,然后等待另一个10毫秒并更新层树,然后更多等待,然后,最后,提供它自990毫秒以来的第一个新帧。
整个过程耗时66毫秒,但根据时间表,网页浏览大部分时间用在了它上面。这也不例外,我在滚动的整个录制过程中看到了这种模式。当我查看从Moto X 1st gen获取的时间线时,webview看起来浪费了更少的时间并尝试尽可能多地提供帧。当然,它并没有一直做到60fps,但在这一点上我很高兴它会做到40而不是20甚至更低。
这里显而易见的问题是"到底发生了什么?" - 或者更准确:"为什么事情(阅读:框架)没有发生?"
PS:我已经检查了Android系统Webview版本,我测试过的所有设备都安装了v52。我唯一能想到的是,操作系统会导致'这个。自棉花糖以来有什么变化吗?
更新
通过将我执行的大部分onscroll-logic转发到requestAnimationFrame并隐藏屏幕外的内容(可见性:隐藏),我已经能够解决大部分延迟问题。但这并没有真正解释为什么Chrome似乎只是在没有真正做任何事情的情况下跳过框架。它似乎与滚动大面积相当复杂的内容有关,但我希望在某种形式的时间轴中看到它。相反,它只显示阻止帧渲染的大空格。?