在谈动画性能之前,先介绍一些概念。
帧率(FPS):描述每秒播放的帧数,单位为 Hz 或者 frame/s (帧/秒)。
理论上说,FPS越高,动画会越流畅,但是,因为大部分的显示器刷新频率是 60Hz,当动画的FPS超过 60Hz 时,会出现画面撕裂现象(显示器会把两个或更多的帧显示在同一画面上)。所以通常来讲 FPS 为 60frame/s 时动画效果最好,也就是每帧16.67ms,在浏览器中要减去渲染时间1ms左右,得到的结果是每帧时间大概15ms。
如果用 setInterval 来做动画,每帧时间大概设置成13ms(jQuery 用的 13ms)。因为用 setInterval 会有1ms左右的延时。当然在高级浏览器中,当然是用 requestAnimationFrame 来做动画啦。
在Chrome中查看帧率
在Chrome中查看帧率
浏览器在渲染一个页面时,会将页面分为很多个图层,图层有大有小,每个图层上有一个或多个节点。在渲染DOM的时候,浏览器所做的工作实际上是:
当 Chrome 首次为一个 web 页面创建一个帧(frame)时,以上步骤都需要执行。但对于以后出现的帧可以走些捷径:
如果图层中某个元素需要重绘,那么整个图层都需要重绘。
Chrome 中,图层分为 RenderLayer(负责 DOM 子树),GraphicsLayer(负责 RenderLayer 的子树)。 只有 GraphicsLayer 是作为纹理(texture)上传给 GPU 的。
借助于显卡的优势改变了渲染方式,被称为硬件加速(hardware acceleration)。
改变了渲染方式是指,对硬件加速的元素以transform的方式进行位移(translate)、旋转(rotate)、缩放(scale)时,这些操作会由GPU来处理,而不会触发浏览器的重绘(CPU处理)。
具体见 Rendering: repaint, reflow/relayout, restyle
生成复合层(composited layer/GraphicsLayer)的方式。 对于普通元素(除去Video,iframe,Flash等插件),通过设置
在chrome浏览器中查看复合层的方式为
查看复合层的方式为
页面上的复合层会有黄色边框。
待续(Canvas,SVG里做动画的效率,JS的一些动画优化库)