Open creeperyang opened 9 years ago
在开发者工具的timeline里,我们可以看到一个典型的渲染过程基本如下:
满足上述某个条件,浏览器就会单独创建一个layer。
什么叫流畅?60fps,即要在16.7ms内把一帧准备好。
想要流畅需考虑两个问题:
setTimeout不够精确会导致丢帧,因为屏幕刷新频率60HZ是不变的。比如设置setTimeout 16,每隔一段时间后,就会有丢帧。
读取以下属性会引起Layout:
clientHeight/Left/Top/Width, focus(),getBoundingClientRect(),getClientRects(),innerText,offsetHeight/Left/Top/Width/Parent,outerText(),scrollByLines(),scrollByPages(),scrollHeight/Left/Top/Width,scrollIntoView()...
用transform代替top/left
var h1 = el1.clientHeight; el1.style.height = (h1 + 4)+ 'px'; // 等待layout var h2 = el2.clientHeight; // 读属性,强制layout el2.style.height = (h2 + 4)+ 'px'; // 等待layout var h3 = el3.clientHeight; // 读属性,强制layout el3.style.height = (h3 + 4)+ 'px'; // 等待layout
分离读写操作,比如用requestAnimationFrame把写操作推到下一帧。
修改box-shadow,border-radius,color等展示相关属性时,会触发Paint
box-shadow等Paint代价昂贵。
渲染过程
渲染流程
在开发者工具的timeline里,我们可以看到一个典型的渲染过程基本如下:
渲染小结
硬件加速(GPU加速)
Layer模型
Layer触发条件
满足上述某个条件,浏览器就会单独创建一个layer。
硬件加速节省了哪些时间
流畅动画
什么叫流畅?60fps,即要在16.7ms内把一帧准备好。
想要流畅需考虑两个问题:
渲染时机
setTimeout不够精确
setTimeout不够精确会导致丢帧,因为屏幕刷新频率60HZ是不变的。比如设置setTimeout 16,每隔一段时间后,就会有丢帧。
requestAnimationFrame
渲染一帧的时间
从Layout来减小渲染时间
触发Layout
读取以下属性会引起Layout:
clientHeight/Left/Top/Width, focus(),getBoundingClientRect(),getClientRects(),innerText,offsetHeight/Left/Top/Width/Parent,outerText(),scrollByLines(),scrollByPages(),scrollHeight/Left/Top/Width,scrollIntoView()...
尽量不触发Layout
用transform代替top/left
不要频繁Layout
分离读写操作,比如用requestAnimationFrame把写操作推到下一帧。
Layout小结
从Paint来减小渲染时间
触发Paint
修改box-shadow,border-radius,color等展示相关属性时,会触发Paint
Paint代价
box-shadow等Paint代价昂贵。
减少不必要的Paint