从前端角度看网页渲染慢的原理及解决方案

1.网页的写法导致渲染时产生的平台相关的layer过多。

浏览器在网页排版的时候会产生一棵render tree用于渲染。由于z-index和一些特殊元素如overflowfixed元素等的存在,浏览器为了保证渲染的正确,真正渲染的时候不直接使用render tree,而是根据render tree的信息产生一棵对应的renderLayer treeRenderLayer可以理解为是一个平面,上面可能对应着一个或者多个render tree上的节点,而对应当前主流的支持硬件加速的浏览器而言,还要基于renderLayer tree生成对应的graphicsLayer tree,那么在不同的平台上这棵graphicsLayer tree又对应于平台相关的实现,在android平台上就是layerAndroid tree了。layerAndroid tree有两棵,一个在内核线程,负责收集内核线程排版后产生的renderLayer tree的经过处理的信息,另一个在UI线程,由内核线程的layerAndroid tree复制得到,真正渲染的时候就是通过遍历这个UI线程的layerAndroid tree来实现,由于每个layerAndroid分开渲染之后再进行组合,所以一个layerAndroid的内容改变并不会影响到其他layerAndroid,所以网页部分内容的修改就不会导致整体网页的重绘了。因此,为某些特别的网页元素产生layer,会提高网页的渲染效率。但是有些时候过犹不及,如果网页产生的layerAndroid过多,遍历和绘制layerAndroid tree的时间就会变得非常长,这个时候就会出现渲染变慢和卡顿的问题了。而layerAndroid tree基本上是与graphicsLayer tree对应的,所以我们可以通过追查graphicsLayer的产生原因来分析layer过多导致的卡顿原因。

 

接上面,layerAndroid tree是根据graphicsLayer tree生成的,而graphicsLayer tree是根据renderLayer tree生成的。为了网页上一些特殊元素的渲染正确,两棵树上的节点并不是一一对应的,renderLayer tree上的节点可能不产生graphicsLayer,也可能产生不止一个graphicsLayer

 

1.1 renderLayer在以下条件下会产生对应的graphicsLayer

1> video元素

2>canvas元素

3>插件如flash元素

4>frameiframe元素

5>网页元素有一些3d变换属性如translate3dPreserve3D

6>网页元素有backface-visibility:hidden属性

7>网页元素正在进行加速动画

8>网页使用了CSS Filter

9>Fixed元素

10>网页元素有overflow:scroll或者overflow:auto(产生滚动条的情况,与

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值