[关闭]
@FunC 2017-04-23T20:55:51.000000Z 字数 1867 阅读 2309

性能优化相关

未分类


关键路径渲染

60FPS动画

目前屏幕一般刷新率为60Hz
要在1000ms内渲染60帧,每帧要在16ms内完成渲染(但浏览器还要处理些别的任务,实际上只有10~12ms可供渲染)

词法解析(parse HTML)

构建DOM和CSSOM

渲染树(Recalculate Styles)

非视觉元素不出现在render Tree,如meta,head等标签,display:none的元素
注意:height:0、position:absolute;left:99999px;的元素仍会出现在render tree

开始计算尺寸(Layout/reflow)

关于layout,其实有其作用域(layout scope)。大部分情况下尽管只改变app的一小部分,还是会触发整个页面的reflow,意味着上千个节点受到影响。

想拥有layout boundary(布局边界),需满足以下条件:

  1. 根标签为.
  2. 的文本或搜索域.
    或者
  3. display不为 inline 或 inline-block
  4. 不含有百分比高度
  5. 不含有隐式的或值为auto的宽高
  6. overflow有显式的值(即scroll, auto 或 hidden).
  7. 不是的子元素.


从矢量数据(vector)转换成栅格化数据(raster)(即填充到像素格子里)(Paint)
绘制位图(draw Bitmap)(浏览器解析图片数据并进行缩放:Image Decode+Resize)

(处理图层部分为:composite layers)
单独绘制的图层(layers)(在CPU上发生)
发送图层和图像块给GPU,让其合成并展示

layout很复杂,一般假设layout scope为整个DOM


js/css animation/web animation api > style > layout > paint > composite
用js和css触发上述管道不一定每一次都完整走完,三种情况
1. 改变了layout相关属性(如width),则全部触发
2. 仅改变了paint相关属性(background-color),不触发layout
3. 仅改变图层相关属性,不触发layout和paint
注意,三种情况中style每次都会进行计算,因为改变了style(即样式属性发生了变化)

区别:使用flexbox时,resize不用重新计算style,因为style属性没有变化
区别2:如果有resize handler触发style变化,或者触发media query使style变化,都要进行style计算


到csstrigeer.com查看那些元素会触发layout、paint和composite,尽可能选择耗能低的


网络应用的生命周期

不总需要保持60fps(如更改颜色方案、有滑入/滑出动画时)

网络应用的生命周期四阶段:RAIL(便于记忆、实际顺序是LIAR)
R:Response | 100ms
A:Animation | 16ms/帧(实际10~12ms)
I:Idle(闲置)| 50ms
L:Load | 1s

加载与闲置

加载(Load)完后,一般处于闲置(Idle)状态,等待用户去互动(Interact),此时是执行要推迟(defer)的任务的绝佳时间,从而达到1s加载完毕的感觉。
通常闲置时间为50ms
以新闻app的文章页面为例(有文本,图片,视频,评论区)
因核心目的为阅读新闻,所以文本必须先加载(用户会花时间阅读文本,留出idle时间)
闲置时间适宜加载的内容:image、videos、comments section等,
不适宜加载的内容:文本和基础且必要的功能

响应

对用户的操作作出反应
1. 简单的:点击按钮
2. 复杂的:会触发动画的(因为要求16ms/帧)

动画

  1. FLIP(First,Last,Invert,Play)

    原理:一旦浏览器完成了性能消耗高的动画,逆向进行将变得简单。看起来高耗时的计算位置工作在click到animation begin之间的100ms(response可接受时间)内完成(实际能满足)
    先计算一开始的位置(First),可使用getBoundingClientRect();计算最后的位置,应用动画(配合opacity,因为性能优秀)


RAIL应用场景

  1. 菊花图是否应该在触发视频时发起请求?
    答案:否,可能超过16ms。即使不超过16ms,额外的时间也会拖长这一帧使其超过16ms。

  2. 在idle时可加载的内容
    答:非首屏内容都可尝试进行加载(包裹FLIP的计算)

尽管有一定的时间可以用于计算,但注意时间不是无限的。减少影响的元素的数量有助于优化计算时间

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注