高性能Web动画和渲染原理系列(3)——transform和opacity为什么高性能
目录
示例代码托管在:http://www.github.com/dashnowords/blogs
博客园地址:《大史住在大前端》原创博文目录
华为云社区地址:【你要的前端打怪升级指南】
关于
opacity
和transform
的动画性能的话题,机会总是会涉及到“合成层”或者“硬件加速”的概念,理解起来让人觉得非常混乱,最近研究渲染相关的知识后,希望将这几个概念逐步梳理清楚。一. opacity动画为什么性能好
opacity
单词意思为透明度,直观视觉效果就是颜色变淡了,但最终显示的颜色其实仍然可以用RGB三个通道来表示,从数值运算的角度来看,它实际上表示了它采用一般混合策略和其他颜色进行混合时的比例,也就是:例如在网页默认的白底色上
rgba(255,255,255)
显示一个包含透明度的rgba(218,89,97,0.8)
颜色, 那么颜色的RGB分量都按照上述公式进行计算就得到rgb(225,122,128)
,用取色器拾取一下渲染出来的点,结果和上述理论是一致的:所以
opacity
这个属性本身就是用在重叠部分颜色处理的过程中使用的,对于分层的图原来说就可以看作是与图层内容无关的系数,因为合成过程中当前层中所有像素都需要经历上面的颜色混合公式,所以opacity
的动画过程既不会影响布局,也不需要重绘。这样图层中保存的RGB像素数据的缓存在动画过程中也就不需要更新了,如果不使用opacity
属性的话,每一帧对于变化部分都需要手动重计算RGB颜色值(这也就相当于是重绘了),因为这些区域的像素颜色一直都在变化,缓存也就没有意义。现在再来看看opacity
的性能优势,就相对容易理解了。二. transform动画为什么性能好
transform
的性能优势和opacity
的原因是一致的,而不是因为有“硬件加速”的加持。transform
属性支持的位移函数translate( )
,缩放比例函数scale( )
,斜切函数skew( )
和旋转函数rotate( )
都可以转换为线性映射的形式,也就是matrix( )
表示的方式,简单来说就是所有transform
实现的效果都可以对原坐标系中的点[x,y]
按照如下的齐次矩阵进行计算得到变换后的点坐标[x',y']
:齐次矩阵的系数是设定
transform
变换时传入的,是一个已知项,而使用三维的齐次矩阵是因为二维坐标的点在变换时会产生常数项(主要是平移变换),而如果以二维矩阵作为参数来计算时,以x
坐标变换为例,结果的形式就是