update layer tree导致页面卡顿
前因
今天检查一个vue页面问题,就是在切换Tab时候(某些win10电脑),页面会卡顿一段很长的时间,短则3秒,长则十几秒,这个体验非常糟糕,于是我着手寻找其中原因。
概况
这个vue页面的元素非常多,主要分为六个Tab内容,切换Tab也只是控制Tab内容的显隐。按道理这是非常简单的行为,不应该出现卡顿的情况。
检查
代码上,我将切换Tab做的一些业务逻辑去掉,只留下控制显隐部分,并打印执行时间。
测试过后发现,即便是这么简单的操作,页面还是会卡顿,从打印的日志上看,我发现了切换的代码很快就执行完了,是后续的渲染卡顿了。
Timeline
我打开了控制台工具,点到Timeline那一栏,检查js的执行情况。
效果如下:

果然有一长串一直在执行的东西,上图紫色部分,卡顿的时间就是在执行这玩意。

放大紫色部分,发现这一长条紫色是由一块块小块紫色任务组成的,每个小块执行的都是同一个东西,都是在执行update layer tree这个动作。
思考
这update layer tree是浏览器渲染页面的其中一个行为,但我很奇怪,为什么会有这么多这种操作。
PS:了解update layer tree需要知道什么是页面重绘(repaint)和回流(reflow),可以看我另一篇文章:https://www.cnblogs.com/lovesong/p/8046730.html
我的代码:
我Tab切换是用‘visibility:hidden’,由vue一个计算属性控制,当初为了某些功能,才没使用‘display:none’的。
引用:
https://stackoverflow.com/questions/25724126/chrome-devtools-timeline-update-layer-tree-event
这个问题里面出现了跟我相似的情况,我看了其中的解答,大体意思,’当前树的某个显示层失效,导致该层次结构要更新一层,引发该层次结构上每个层都被更新。’
PS:这里说的树应该是render tree。
原因:
难道因为‘visibility:hidden’的切换,导致render tree的更新异常?
PS:其实按道理,即便是所有的块都更新了,也不应该更新那么多次,卡那么久。
所以,我猜想,可能页面里面某些元素的显隐导致了render tree循环更新了。
我将‘visibility:hidden’换成‘display:none’控制,测试一下,果然就没不卡顿了。
后续
我没有找到哪个位置导致的render tree更新异常,目前只能更换Tab切换方式,从源头截止。
另外,如果发现页面卡顿了,可以用Timeline这个工具查看,非常不错。
update layer tree导致页面卡顿的更多相关文章
- 记录一个关于 Document.on绑定事件后,导致页面卡顿的情况
		
假设当前页面的js文件中有如下函数: function A(){ function B(); } function B(){ $(document).on("click",&quo ...
 - position: relative;导致页面卡顿
		
1.现象: vue单页面项目 只有在某个页面切换的时候出现页面卡顿现象 经过长时间排查 确定最终原因是 该模块外层div使用 position: relative 根本原因:待完善
 - 手机页面或是APP中减少使用setTimeout和setInterval,因为他们会导致页面卡顿
		
1.setTimeout致使页面的卡顿或是不流畅,打乱模块的生命周期 ,还有setTimeout其实是很难调试的. 当一个页面有众多js代码的时候,setTimeout就是导致页面的卡顿. var s ...
 - DOM节点太多导致页面卡顿的优化方法
		
http://developer.51cto.com/art/201504/473422.htm
 - firefox中outlook.com页面卡顿的原因
		
在火狐中使用outlook.com时,鼠标点击动作后,页面会卡顿一段时间,每次点击都是如此. 因为之前火狐出现由于硬件加速导致页面卡顿的情况,因此第一反应就是关闭硬件加速. 果然,关闭硬件加速后,页面 ...
 - Effective前端6:避免页面卡顿
		
.aligncenter { clear: both; display: block; margin-left: auto; margin-right: auto } .crayon-line spa ...
 - iscroll使用之页面卡顿问题
		
最近在开发项目时,遇到一个问题,使用iscroll实现的页面滚动,测试时发现在chrome浏览器中的模拟移动设备页面不能平滑滚动,有卡顿现象,在android手机端也有同样的问题. 在github上搜 ...
 - Android Scrollview嵌套RecyclerView导致滑动卡顿问题解决
		
一个比较长的界面一般都是Scrollview嵌套RecyclerView来解决.不过这样的UI并不是我们开发人员想看到的,实际上嵌套之后.因为Scrollview和RecyclerView都是滑动控件 ...
 - 【生产问题】--8KW的数据表导致业务卡顿
		
问题描述:业务突然变得巨卡 分析思路: (1)分析用户请求进程:查看是否有长期运行霸占锁的情况,或者进程数量巨多.很明显我这里就是巨多,正常情况一般0~40来个的样子,在业务使用高峰期居然达到了140 ...
 
随机推荐
- C# 转换关键字 operator
			
operator 使用 operator 关键字重载内置运算符,或在类或结构声明中提供用户定义的转换. 假设场景,一个Student类,有语文和数学两科成绩,Chinese Math,加减两科成绩,不 ...
 - 腾讯防水墙(滑动验证码)的简单使用 https://007.qq.com
			
在线体验:https://007.qq.com/online.html 快速开始:https://007.qq.com/quick-start.html 简单使用: 1. 引入 JS <scri ...
 - springMVC_07乱码及restful风格
			
乱码的解决 通过过滤器解决乱码问题:CharacterEncodingFilter 配置web.xml文件 <filter> <filter-name>encoding< ...
 - Tomcat服务器为java项目配置顶级域名
			
修改端口, Tomcat服务器下conf/server.xml文件 把端口号更改为80 解释:输入域名时默认进入80端口,如果没修改则需要输入端口号才能进入. Eg:www.xxx.com: ...
 - js的介绍 及用法 常量 变量!
			
1.js介绍 js全程叫javascript,但不是java 他是一门前台语言 而java是后台语言. js的作者是布兰登 爱奇 前台语言:运行在客户端 后台语言:跟数据库有关的. 2.能干什么? 页 ...
 - PATH环境变量
			
PATH是环境变量,要大写 那几个目录是你放置linux命令的目录,输入命令后系统会去PATH中寻找是否存在该命令 查看当前环境变量: echo $PATH 也可以用set命令看一下 设置: expo ...
 - es6 语法 (数组扩展)
			
{ let arr = Array.of(3, 4, 7, 9, 11); console.log('arr', arr); //[3,4,7,9,11] let empty = Array.of() ...
 - CSS3动画:流彩文字效果+图片模糊效果+边框伸展效果实现
			
前言 首先第一步,先布局html代码如下: <div class="wrap"> <img src="images/1.jpg" class= ...
 - loj#6436. 「PKUSC2018」神仙的游戏(生成函数)
			
题意 链接 Sol 生成函数题都好神仙啊qwq 我们考虑枚举一个长度\(len\).有一个结论是如果我们按\(N - len\)的余数分类,若同一组内的全为\(0\)或全为\(1\)(?不算),那么存 ...
 - BZOJ3028: 食物(生成函数)
			
题意 链接 Sol 生成函数入门题. 对每个物品分别列一下,化到最后是\(\frac{x}{(1-x)^4}\) 根据广义二项式定理,最后答案是\(C_{(N - 1) + 4 - 1}^{4-1} ...