RAIL 是一个以用户为中心的性能模型,包含一下四个性能指标。
加载阶段(Response):您有 1000ms 的时间进行响应 闲置阶段(Load):做优先级不高的事情,确保之后出现的任何互动都能及时响应 50ms 动画阶段(Idle):用户滚动屏幕或者出现动画 你需要 16ms 渲染一帧 响应阶段(Response):人的大脑可以忍受 100ms 的停顿时间,如果再长人们会觉得不流畅
掌握关键渲染路径,以及修改 CSS 属性会触发哪些步骤,从而影响性能,理解这一过程是优化应用性能的关键
<style> div{ display:none } </style> <div>this is a div<div>
学习如何使开发者工具找出性能的瓶径处
在移动设备上使用开发者工具
录制你的第一个时间线,你可以浏览任何一个网站,利用 Performance 录制帧率,然然后浏览时间线,分析每一帧进行的哪些工作
分析能不能达到 60fps?参看不稳定性是哪个函数导致的?
要达到 60fps,浏览器只有 16ms 时间渲染每一帧,然后浏览器还有额外的工作要做,所以我们应该控制在 10ms 内完成渲染工作
所以一帧的 JavaScript 最长处理时间应该在 3-4ms,因为还有样式计算,布局,绘制和图层合并等工作要做,接下来我们学习怎么样使 JavaScript 不会妨碍我们这一目标
requestAnimation
requestAnimationFrame API 会安排 Javascript 尽早在每一帧的开始执行,从而留给浏览器足够的时间运行代码(样式->布局->绘制->合并)
IE9 不支持 requestAnimationFrame,你需要使用 polyrequestAnimationFrame Polyfill (opens new window):它会替代用 setTimeout 执行动画
webworker
内存管理
现在,我们来针对 Javascript 优化页面性能。复制我们给出来样例代码webWorkersTask01.zip (opens new window),然后保存到本地。
网页上半部分展示了一个救护车动画,下半部分实现了一个杨辉三角的生成器,但是网页性能存在一定问题:点击开始救援按钮,救护车动画开始执行,但是这个时候在杨辉三角输入框输入30点击生成按钮,浏览器会开始生成 30 行的杨辉三角,可以看到救护车动画出现的卡顿,甚至停止,这样的用户体验非常不好。请你利用 Web Workers 优化页面性能。
任务要求
样式计算过程将根据 DOM 树,确定每个元素的外观属性,从而生成渲染树,但只会包括需要绘制的元素,任何不需要绘制的元素不会出现在渲染树中。 掌握从样式计算过程中找到性能问题,并且解决这些问题。
更改的元素越多,需要付出的性能代价就越高。
选择器的复杂性也会影响性能,使用 BEM 元素编写选择器
强制同步布局
请求浏览器先运行布局,然后重新计算样式,然后在运行布局就会出现强制同步布局错误
当我们访问某些属性就会导致布局流程 ,您可以查看csstriggers (opens new window)详细了解哪些属性会触发布局流程
原因:任何涉及地理位置的更改.例如位置、尺寸都可能导致强制布局
解决方法:在 JS 阶段先读取布局属性,意味这您将使用上一帧布局,然后批量进行所有的样式修改。这意味着重新计算样式将在帧结束时发生,并处在管道的正确位置
触发了布局就会触发绘制,你需要注意自己修改了哪些属性。动画中尽量避免布局和绘制流程,如果不能避免,你应该掌握如何减少影响
请你针对强制同步布局错误进行修复从而优化页面性能,下载样例代码 FSL.zip (opens new window),然后保存到本地
任务步骤
div.box:not()
绘制流程通常是最影响帧率的,现在我们来学会如何优化合成和绘制流程
下载performance_task.zip (opens new window),保存到本地
打开 index.html,这个页面你在 PC 端运行可能没什么太大的问题,但是在移动端使用切换动画十分卡顿,请你按照下面步骤优化这个页面性能。
模拟移动端 CPU
首先,在分析页面性能之前,请使用 CPU 节流来模拟页面在移动设备上的表现
分析页面性能
按下 Command+Opiton+I(Mac)或者 Control+shift+I (Windows, Linux) 来打开 chorme 开发者工具,进入 Performance 面板,按下录制按钮录制时间线。
查看时间线截图 (opens new window),你会发现掉帧率十分严重,随机选取一个task,查看summary面板,查看性能分析截图 (opens new window),您会发现每一个 task 都触发了布局事件和重绘事件,并且这两个时间也消耗了大量的时间,从而导致页面性能下降。
避免布局事件
分析页面功能,我们知道主要动画效果是页面的切换,请你试试看能不能定位导致卡顿的代码位置
分析代码我们发现页面是采用改变页面元素的 left 属性值实现切换效果,然后这个属性必然会导致布局(layout)和重绘(paint)事件事件发生。 请你使用更加高效的 css transform 属性实现这一个功能,使页面能够避免触发布局(layout)事件,从而提升性能
您可以参考csstrigers.com,查询 css 属性的触发机制。
使用 Paint Flashing 实时查看绘画事件
transform 优化的页面性能之后,我们从绘制层面优化性能。
使用 Paint Flashing 可实时查看页面上的所有绘制事件。每当页面的一部分被重新绘制时,DevTools 都会以绿色勾勒出该部分的轮廓。
开启 Paint Flashing
现在,点击导航栏切换页面,重新绘制的部分会用绿色显示,请你优化绘制事件,创建给合适的元素创建图层,使得切换页面时不会触发绘制事件,开启 Paint Flashing 不会再显示绿色。
实现效果如下图所示
自测问题
更多相关技术内容咨询欢迎前往并持续关注六星社区了解详情。
长按或扫描下方二维码,免费获取 Python公开课和大佬打包整理的几百G的学习资料,内容包含但不限于Python电子书、教程、项目接单、源码等等
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!