高性能Web动画和渲染原理系列(3)——transform和opacity为什么高性能
【摘要】 研究Web高性能动画及原理
示例代码托管在: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
坐标变换为例,结果的形式就是x'=ax+by
,其中是没有常量的,所以只能采用一个三维齐次矩阵来表示,但计算中的第三个坐标实际上并不需要使用。更多的关于变换的数学原理,感兴趣的读者可以自行查阅资料。
所以transform
在动画过程中也不需要改变缓存的记录,而在图层合成时遍历当前层的点然后用上述公式来计算出对应的新坐标点就可以了,它也可以视作一种与图层内容无关的变换,图层中的元素首次生成的位图信息缓存可以被反复使用。比如一段平移动画,如果使用绝对定位+改变left值
的方式来实现,就需要不断计算动画元素的布局并更新它的像素信息,但如果使用translate
来实现,动画元素在文档流中的位置并不需要改变,无论后续平移到多远,都可以使用位图缓存中保存的初始位置信息,再加上变换矩阵的影响在层合并时计算出来,同样既不影响布局,也不需要重绘,这就是它高性能的原因。
三.小结
opacity
和transform
动画的高性能是由于其数学原理决定了可以使用缓存信息,而并不是因为它被硬件加速了。
作者:华为云云享专家大史不说话
往期文章精选
如果让你手写个栈和队列,你还会写吗?
挑战10个最难的Java面试题(附答案)【上】
javascript基础修炼(13)——记一道有趣的JS脑洞练习题
高性能Web动画和渲染原理系列(2)——渲染管线和CPU渲染
高性能Web动画和渲染原理系列(1)——CSS动画和JS动画
一统江湖的大前端(8)- velocity.js 运动的姿势(上)
搞IT产品,请谨记Mobile First
高性能Web动画和渲染原理系列(3)——transform和opacity为什么高性能相关推荐
- 高性能Web动画和渲染原理系列(2)——渲染管线和CPU渲染
[摘要] 介绍浏览器渲染原理及CPU渲染流程 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文目录 一 ...
- 高性能Web动画和渲染原理系列(5)合成层的生成条件和陷阱
[摘要] 关于合成层的知识和动画编写的建议 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文目录 一. ...
- 高性能Web动画和渲染原理系列(4)“Compositor-Pipeline演讲PPT”学习摘要【华为云技术分享】
[摘要] 学习chromium对合成层的处理 示例代码托管在:http://www.github.com/dashnowords/blogs 博客园地址:<大史住在大前端>原创博文目录 附 ...
- 【图文动画详解原理系列】1.MySQL 索引原理详解
MySQL简介 MySQL是一个开放源代码的关系数据库管理系统.原开发者为瑞典的MySQL AB公司,最早是在2001年MySQL3.23进入到管理员的视野并在之后获得广泛的应用.2008年MySQL ...
- 《构建高性能web站点》随笔 无处不在的性能问题
前言– 追寻大牛的足迹,无处不在的"性能"问题. 最近在读郭欣大牛的<构建高性能Web站点>,读完收益颇多.作者从HTTP.多级缓存.服务器并发策略.数据库.负载均衡. ...
- 《msdn开发精选》“高性能Web开发技术”网上聊天活动
<msdn开发精选>"高性能Web开发技术"网上聊天活动 本期嘉宾:郭红俊(ghj1976),孟宪会(孟子E章) ,刘如鸿(策划编辑) 聊天主题:高性能的Web应用程序 ...
- 【Web动画】CSS3 3D 行星运转 浏览器渲染原理
承接上一篇:[CSS3进阶]酷炫的3D旋转透视 . 最近入坑 Web 动画,所以把自己的学习过程记录一下分享给大家. CSS3 3D 行星运转 demo 页面请戳:Demo.(建议使用Chrome打开 ...
- html图片视频渲染原理,初识浏览器渲染原理和CSS动画
1.浏览器渲染原理 浏览器到底是怎么将一个html文件渲染成生动的页面的?话不多说,直接看图 以图中的过程,浏览器的渲染过程大致就是: 通过HTML解析将HTML文件解析为 DOM 树; 通过CSS解 ...
- 前端性能优化之资源传输优化、渲染优化、Web 加载和渲染原理
一.资源传输优化 使用压缩 Gzip,如下所示: 对传输资源进行体积压缩,可高达 90% 配置 Nginx 启用 Gzip 启用 Keep Alive,如下所示: 一个持久的 TCP 连接,节省了连接 ...
最新文章
- Python读取文件夹下的所有文件,并获得文件中的2-10行的信息
- 【PyTorch】Tricks 集锦
- 2013 Multi-University Training Contest 9 1011 Arc of Dream
- golang mysql demo
- 一道滴滴的产品面试题
- python使用自制程序_python--自制程序性能检测工具
- c语言80c51控制系统设计,89C51单片机的步进电动机控制系统设计
- Android获取视频文件时长
- 如何使用OpenSSL工具生成根证书与应用证书
- IO多路复用底层原理及源码解析
- 加密html文件如何转换为pdf,PPT转成PDF后如何加密?其实真的很简单!
- 机器学习项目-垃圾邮件分类-KNN-SVM-DT-RF-GBDT-Bayes
- Android5.0后外置SDCard读写
- 连接Oracle报错 ORA-00257
- [IT学习]从网上获取pdf制作vce文件
- PHP htmlspecialchars()函数用法与实例讲解
- 云计算系统体系架构介绍
- Ubuntu2004系统下佳能MG2400打印机无响应
- Could not target platform: ‘Java SE 11‘ using tool chain: ‘JDK 8 (1.8)‘
- Android逆向工程(一)-Apktool使用
热门文章
- 视觉SLAM十四讲学习笔记-第七讲-视觉里程计-特征点法和特征提取和匹配实践
- 运行Gazebo出现[Err] [REST.cc:205] Error in REST reques
- python内建函数有哪些_Python内建函数大全(一)
- pycharm下打开、执行并调试scrapy爬虫程序
- 关于Linux环境变量
- 自制反汇编逆向分析工具 迭代第六版本 (一)
- BZOJ 3564: [SHOI2014]信号增幅仪(随机增量法)
- ubuntu以及ubuntu类linux系统的运行级别的理解(关闭图形界面)
- 关于预编绎网站的问题[已预编译此应用程序的错误]
- ASP.net 省市级联(用户控件)适用用framework3.5以上版本