SegmentFault思否 · 2021年12月14日

谷歌 Chrome 开发者“揭秘”浏览器窗口遮挡问题:启动速度提升25.8%!

近日,Chrome 开发者 David Bienvenu 在其名为《The Fast and the Curious》系列新博文中,详细“揭秘”了谷歌最近对 Chrome 浏览器所做的一些改进。其中,就包括了谷歌历时 3 年研究创建的 Native Window Occlusion(原生窗口遮挡)项目,可让浏览器启动速度提升 25%。
image.png
据悉,该博文里解释了谷歌为减少 Chrome 中不可见标签和窗口资源消耗所做的工作。谷歌方面称,该操作让 Chrome 的启动速度提高了 25.8%,崩溃次数减少了 4.5%。

该“揭秘”博文还指出,谷歌公司多年来一直在研究怎么更好地确定哪些 Chrome 窗口和选项卡对用户可见,以便能够适当地分配系统资源。

我们知道,不在焦点的选项卡(又称为“背景选项卡”)可降低 CPU 和 GPU 资源的优先级,但被遮挡的窗口(即打开的窗口,但完全或部分被其他窗口覆盖的窗口)又如何呢?

对于这个问题,Bienvenu 在博文中写道,谷歌方面了解到“20% 的 Chrome 窗口完全被其他窗口覆盖,也就是完全被遮挡。如果这些被遮挡的窗口被视为背景标签,那么我们的假设就将看到显著的性能优势。”

于是,谷歌公司便对“Native Window Occlusion”(原生窗口遮挡)项目展开研究,该项目将允许谷歌了解任何打开的 Chrome 窗口的遮挡状态。当然,要想弄明白这一点,他们还必须得知道非 Chrome 浏览器窗口的位置,但这就不是 Windows 操作系统所能提供的信息了。

考虑到多监视器设置和虚拟桌面等因素,以上问题变得更加棘手。

为了解决该问题,谷歌提出了“occlusion calculation(遮挡计算)”方案,它能在 UI 的单独线程中运行,先计算用户的总可见区域,再从虚拟桌面的可见区域中减去所有字作为“遮挡”的 Chrome 窗口,从前到后检查每个打开的窗口,最后再从总数中减去任意打开的窗口。

image.png
如果是 Chrome 窗口,则会检查其区域是否与未被遮挡的区域重叠;如果非 Chrome 窗口,就意味着 Chrome 窗口完全被以前的窗口覆盖即遮挡。此时,软件会一直运行计算,直到所有的 Chrome 窗口都被标记为遮挡,这意味着剩下的部分必须对用户可见。有了这些信息之后,再向计划程序发布一个任务,以提升浏览器窗口的可见性。

谷歌通过评估隐藏窗口提高 Chrome 性能
有了上面的解决方案,谷歌又提出了一个有趣的问题,“我们希望能多久运行一次计算?”

对于这个问题,Bienvenu 也在博文中做了解答。他表示,持续运行会降低性能,因此必须是选择性的运行。

好在 Windows 系统允许应用程序跟踪移动及调整打开窗口大小之类的事件,所以 Chrome 会连接到这些通知中,当用户移动或调整窗口大小时,Chrome 会发出警报,并决定是否进行新的遮挡计算。

Bienvenu 博文中还指出,该计算是在 16ms 计时器上运行的,该计时器对应每秒显示 60帧(FPS)的间隔。

据了解,早在 2020 年 10 月谷歌就面向全部 Chrome 用户推出了这一方案。如今已经过去了一段时间,谷歌也对外分享了以上“实验”的结果。其中包括:

  • 启动速度加快 8.5% 至 25.8%
  • GPU内存使用率降低 3.1%
  • 整体绘制的渲染器帧减少 20.4%
  • 遇到渲染器崩溃的客户端减少 4.5%
  • 首次输入延迟提高 3.0%
  • 首次内容绘制和最大内容绘制速度提高 6.7%

能成功做到上面这些,也是因为谷歌准确地意识到 Chrome 窗口何时被遮挡或完全被其他窗口遮挡的问题。如果你也正在使用 Chrome浏览器的话,现在就可以打开感受一下窗口启动的速度哦!

推荐阅读
关注数
4139
内容数
719
SegmentFault 思否旗下人工智能领域产业媒体,专注技术与产业,一起探索人工智能。
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息