Timeline demo: Diagnosing forced synchronous layouts
这篇文章翻译自https://developers.google.com/chrome-developer-tools/docs/demos/too-much-layout/
他是一个很小的例子,但是是通过timeline从头到尾测试发现并解决一个性能问题。
下面是翻译文章:
有一个例子是教你 如何破由于强制同步布局而导致的性能瓶颈,实例应用程序用[requestAnimationFrame()](http://docs.webplatform.org/wiki/apis/timing/methods/requestAnimationFrame)的基本帧画法,通过几张图片,用动画的形式来回运动,但是我们能很明显的看到掉帧的情况。我们可以用timeline来诊断到底发生了什么。
生成一条记录
首先你将要生成一条这段动画的timeline记录。
- 点击开始动画
- 打开timeline面板并且切换到帧视图
- 点击按钮变红开始记录
- 跑了大概一秒(10-12帧)的时候停止记录,然后停止动画
分析
看第一帧,很清楚的看到已经超过300ms,滑到帧上你可以看到这帧的详细信息。
定位到这个帧动画,会发现有一个黄色的警告,表明被强迫同步布局,说明你的子记录中的代码会有问题,影响到了整条记录。
子记录是一条很长的重绘计算样式和绘制记录,每一个布局记录的结果都是样式计算的结果,每一次requestAnimationFrame()都会要求得到页面上所有图片的offsetTop的值,然而你的鼠标滑过每一条布局记录,并且点击source.js的超链接,然后回调到对应的代码。
资源面板打开第43行的update方法就是回调,回调会计算出图片的left和offsetTop的值,并且立马确定真确的值来计算。
// Animation loop
function update(timestamp) {
for(var m = 0; m < movers.length; m++) {
movers[m].style.left = ((Math.sin(movers[m].offsetTop + timestamp/1000)+1) * 500) + 'px';
}
raf = window.requestAnimationFrame(update);
};
他会让每一帧变慢,现在我们来修复这个bug
现在我们可以把问题代码进行修改,并且直接在timeline中测试,是否修复了这个问题。
movers[m].style.left = ((Math.sin(m + timestamp/1000)+1) * 500) + 'px';
这个版本是用变量数组来保存left的值。
- Cmd-S or Ctrl-保存修改
验证结果,动画明显更快更流畅了。
zp8497586rq



