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 ...
随机推荐
- 建了个QQ群,不定期分享一些资料,欢迎加入
技术源于生活,大家一起进阶 Java学习交流QQ群:603654340 大数据学习交流QQ群:217770236 感谢您的来访,不妨关注一下我吧……
- echarts tab 切换问题整理
一.bootstrap tabs 解决方案 方式一 tab切换echarts无法正常显示 https://blog.csdn.net/cjs68/article/details/78072382 ta ...
- [android] 插入一条记录到系统短信应用里
谷歌市场上有这些应用,模拟短信,原理就是把数据插入到短信应用的数据库里 获取ContentResolver对象,通过getContentResolver()方法 调用resolver对象的insert ...
- C#设计模式之九组合模式(Composite Pattern)【结构型】
一.引言 今天我们要讲[结构型]设计模式的第四个模式,该模式是[组合模式],英文名称是:Composite Pattern.当我们谈到这个模式的时候,有一个物件和这个模式很像,也符合这个模式要表达的意 ...
- 为什么越来越少的人用jQuery
摘要:JQuery该退役了. 原文:为什么越来越少的人用jQuery 作者:Lemonade Fundebug经授权转载,版权归原作者所有. 最早期的开发,大多都使用jQuery,它给我们带来了很多的 ...
- LeetCode | HouseCode 算法题
题目: You are a professional robber planning to rob houses along a street. Each house has a certain am ...
- JS实现数组去重方法整理
前言 我们先来看下面的例子,当然来源与网络,地址<删除数组中多个不连续的数组元素的正确姿势> 我们现在将数组中所有的‘ a’ 元素删除: var arr = ['a', 'a', 'b', ...
- Django之django模型层二多表操作
一 创建模型 表和表之间的关系 一对一.多对一.多对多 ,用book表和publish表自己来想想关系,想想里面的操作,加外键约束和不加外键约束的区别,一对一的外键约束是在一对多的约束上加上唯一约束. ...
- springboot Redis 缓存
1,先整合 redis 和 mybatis 步骤一: springboot 整合 redis 步骤二: springboot 整合 mybatis 2,启动类添加 @EnableCaching 注解, ...
- Vue之axios请求数据
引入文件 <script src="https://cdn.staticfile.org/vue-resource/1.5.1/vue-resource.min.js"> ...