1. 前言:

        一位客户向我定制了一款网页版区块链游戏自动挂机脚本,主要需求是定时派遣队伍外出打工,定时派回等功能。

        脚本我主要用JavaScript代码来实现,用定时器 setInterval()、setTimeout() 来定时点击页面上的元素,然后给浏览器安装个Tampermonkey油猴插件将JS脚本丢进去,网页一打开代码就能自动运行,最后只要在服务器上挂着游戏就行啦 !


        在一天漫长的挂机后,进入服务器却发现脚本离奇的停止了 (俺已经确认了这段代码没BUG)。

        在反复测试几遍后,发现挂机时间越长,出现概率越大,而且,只要将浏览器最小化,脚本就十分不稳定,出现部分按钮偶尔无法被点击到等稳定性问题。


2. 原因 :

        查阅资料后发现,谷歌为减少电脑内存过多不必要的损耗,带来浏览器的性能提升,向 Windows 上的所有 Chrome 浏览器加入一项名为“本地窗口遮蔽(Native Window Occlusion)” 的新功能。

     “本地窗口遮蔽”功能可以节制后台标签的优先级,以减少浏览器的资源使用,并将“更多内存、CPU 和 GPU 留给前台标签”

简单来说:浏览器上某一标签页在满足某些条件时,会设置该标签为背景标签”,而随着时间越长,可能会出现 动画延迟或停止渲染、JavaScript 代码(定时器)停止执行、精准程度下降等影响。


满足条件包括但不限于以下几点:

  • 浏览器最小化的时候,标签页都被视为背景标签;
  • 当屏幕被锁定时,所有 Chrome 窗口都被视为背景标签;
  • 当我们浏览器将当前页面A切换到另外一个标签页B时,A被视为背景标签;

3. 解决方法: (仅支持chrome 9.7及以前版本)

1. 谷歌浏览器中访问链接: chrome://flags/

2. 搜索Calculate window occlusion on Windows,把该项的设置改成 Disable

    注: 如果搜索不到,先搜索 Temporarily unexpire M96 flags ,改为Enabled,再搜索上面的内容

3. 重启浏览器。

本方法需要客户端手动更改浏览器配置,适用于只在 Windows 版的 Chrome 浏览器中有效。


对于项目而言,可以参考大佬用到的解决办法:当浏览器切换到其他标签页或者最小化时,你的js定时器还准时吗?

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐