当前位置: 首页 > news >正文

webkit浏览器渲染影响因素分析

前言:浏览器的渲染对性能影响非常大,特别是在移动端页面,在宏观上,我们可以参考雅虎那20几条军规来操作,但在微观渲染层面,实际还没有一套相对成型的理论做为依据。

本文只是抛砖引玉,带大家进入微观的优化领域,实际在渲染优化这块上,还有很多技巧及方法需要大家去挖掘。本文写的也比较凌乱,望包涵!!

 

 

先来看个chrome timeline 工具上的一个图:

rendering1

 

在timeline上,我们看到有6种颜色的柱子,这6个类型的柱子构建了整个webkit浏览器的渲染过程。

简单的分类一下:蓝色表示加载,黄色表示脚本执行,紫色表示计算样式及布局,绿色表示绘制合成,白色表示空闲时间,灰色表示其他时间。这里主要看的是前面三个。

如下图:

rendering2

 

蓝色loading包含各种资源加载,在页面初始化加载阶段可以看到蓝色部分是耗时最长的,因为正在加载资源(加载html、css、js、img、flash、mp3等。)

 

Chrome上各个渲染部分的实际含义:

Parse Html:

发送一个http请求,获取请求的内容,然后解析html的过程。

Recalculate Style:

重新计算样式,它计算的是Style,和Layout做的事情完全不同。Layout计算的一个元素绝对的位置和尺寸,或者说是“Compute Layout”。

Recalculate被触发的时候做的事情就是处理JavaScript给元素设置的样式而已。Recalculate Style会计算出Render 树(渲染树),然后从根节点开始进行页面渲染,将CSS附加到DOM上的过程。

任何企图改变元素样式的操作都会触发Recalculate。同Layout一样,它也是在JavaScript执行完成后才触发的。

Layout:

计算页面上的布局,即元素在文档中的位置及大小。如上面所说,Layout计算的是布局位置信息。任何有可能改变元素位置或大小的样式都会触发这个Layout事件,如width、height

Rasterizer:

光栅化,一般的安卓手机都会进行光栅化,光栅主要是针对图形的一个栅格化过程。低端手机在这部分耗时还蛮多的。

Paint:

页面上显示东西有任何变动都会触发Paint。包括拖动滚动条、鼠标选中文字,等这些完全不改变样式,只改变显示结果的动作都会触发Paint。

Paint的工作就是把文档中用户可见的那一部分展现给用户。Paint是把Layout和Recalculate的计算的结果直接在浏览器窗体上绘制出来,它并不实现具体的元素计算。

Image Decode:

图片解码,将图片解析到浏览器上显示的过程。

Image Resize:

图片的大小设置,图片加载解析后,若发现图片大小并不是实际的大小(CSS改变了宽高),则需要Resize。Resize越大,耗时越久,所以尽量以图片的原始大小输出。

Composite Layers:

最后合并图层,输出页面到屏幕。浏览器在渲染过程中会将一些含义特殊样式的DOM结构绘制于其他图层,有点类似于Photoshop的图层概念。一张图片在Photoshop是由多个图层组合而成,而浏览器最终显示的页面实际也是有多个图层构成的。

有哪些因素会导致新建图层:

1、进行3D或者透视变换的CSS属性
2、使用硬件加速视频解码的<video>元素
3、具有3D(WebGL)上下文或者硬件加速的2D上下文的<canvas>元素
4、组合型插件(即Flash)
5、具有有CSS透明度动画或者使用动画式Webkit变换的元素
6、具有硬件加速的CSS滤镜的元素

在CSS里面,不同的属性会触发不同的layout或者paint,所以通过JS改变css的属性时,应该考虑到这些方面。如下图:

2

再引用另外一张图来看看CSS不同属性所触发的情况:

3

关于CSS属性的一个渲染问题,可以看下表,需FQ查看:https://docs.google.com/spreadsheet/pub?key=0ArK1Uipy0SbDdHVLc1ozTFlja1dhb25QNGhJMXN5MXc&single=true&gid=0&output=html

 

如何优化渲染时间

1、为了确保页面的流程,必须保证60fps内不发生2次渲染树更新。如下图,16ms内只发生如下几个操作则是正常及正确的

QQ截图20140817214845

 

2、页面滚动时,需要避免不必要的渲染及长时间渲染。

不必要的渲染包括:

1)position:fixed

fixed定位在滚动时会不停的进行渲染,特别是如果是页面顶部有个fiexd,页面底部有个类似返回顶部的fixed,则在滚动时会整个页面进行渲染,效率非常低。可以加transform: translateZ(0);解决。

7

2) overflow:scroll

3) hover effects

有些:hover伪类在页面滚动时会不小心就触发到,如hover效果有阴影、圆角等比较耗时的属性时,建议页面滚动时,先取消hover效果,滚动停止后再加上hover效果。这个可以通过在外层加类名进行控制。

4) touch listeners

6

长时间渲染包括:

1)复杂的CSS

2)Image Decodes

这里特别是图片的Image Decodes及 Images Resize 这2个过程在移动端是非常耗时的,如下图:

4

3)Large empty layers(大的空图层,DIV)

5

 

 

参考:https://speakerdeck.com/addyosmani/velocityconf-rendering-performance-case-studies

转载于:https://www.cnblogs.com/chris-oil/p/4164704.html

相关文章:

  • nginx+tomcat+mysql架构搭建
  • JVM运行时(框架图)
  • TreeSet排序和HashSet去重
  • Cocos2d-x编程中的runOnUiThread方法和runOnGLThread方法剖析
  • DML数据操作语言之常用函数
  • Oracle Dedicated server 和 Shared server(专用模式 和 共享模式) 说明(转)
  • 修改mysql的编码
  • (轉)JSON.stringify 语法实例讲解
  • FTP笔记
  • web应用程序使用jdbc连接rac数据库失败
  • 2761: [JLOI2011]不重复数字(哈希表)
  • 上市之后:曙光服务器“新规”
  • Fragment介绍(一)
  • (转)视频码率,帧率和分辨率的联系与区别
  • LVS-DR负载均衡模式的arp_announce和arp_ignore详解
  • 深入了解以太坊
  • 30秒的PHP代码片段(1)数组 - Array
  • Android优雅地处理按钮重复点击
  • Docker 1.12实践:Docker Service、Stack与分布式应用捆绑包
  • Spark学习笔记之相关记录
  • SpringCloud集成分布式事务LCN (一)
  • webpack4 一点通
  • 跨域
  • 利用jquery编写加法运算验证码
  • 面试总结JavaScript篇
  • 我从编程教室毕业
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (Mirage系列之二)VMware Horizon Mirage的经典用户用例及真实案例分析
  • (初研) Sentence-embedding fine-tune notebook
  • (仿QQ聊天消息列表加载)wp7 listbox 列表项逐一加载的一种实现方式,以及加入渐显动画...
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)基于SSM多源异构数据关联技术构建智能校园-计算机毕设 64366
  • (一)【Jmeter】JDK及Jmeter的安装部署及简单配置
  • (转) Android中ViewStub组件使用
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .bat批处理(三):变量声明、设置、拼接、截取
  • .Mobi域名介绍
  • .NET 5种线程安全集合
  • .net core 依赖注入的基本用发
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .net refrector
  • .Net8 Blazor 尝鲜
  • .NET中两种OCR方式对比
  • ?php echo ?,?php echo Hello world!;?
  • @data注解_一枚 架构师 也不会用的Lombok注解,相见恨晚
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • [ 云计算 | AWS 实践 ] 基于 Amazon S3 协议搭建个人云存储服务
  • [<死锁专题>]
  • [20181219]script使用小技巧.txt
  • [Assignment] C++1
  • [C#]winform利用seetaface6实现C#人脸检测活体检测口罩检测年龄预测性别判断眼睛状态检测
  • [CareerCup] 12.3 Test Move Method in a Chess Game 测试象棋游戏中的移动方法
  • [luogu4162 SCOI2009] 最长距离(最短路)