利用GPU渲染加速CSS动画

“Lift not the painted veil which those who live

Call Life: though unreal shapes be pictured there,

And it but mimic all we would believe”

每个网页或多或少都涉及到一些CSS动画 通常简单的动画对于性能的影响微乎其微 然而如果涉及到稍显复杂的动画 不当的处理方式会使性能问题变得十分突出 几个礼拜前在公司做了个presentation 标题是Faster Animation with GPU accelerated CSS本文是对此的文字总结

之前参与过的两个项目里都要求用原生JS去实现对于网页中某个元素的位置进行持续而频繁的改变 我遇到的问题是动画的卡顿甚至停滞 搜寻了很久解决方法 甚至比对了我的代码和Github上完成相同功能的插件代码的差异 最后通过改变几个CSS属性很大程度上改善了动画

我们都知道 如果要在一个页面上移动一个现有的元素 通常有四种方法 比如说改变元素的margin而这几种方法的性能各异 通过测试不难看出 给元素的transform属性设置translate3d(x,y,z)是最快的方法

这其实和网页的渲染过程有关transform: translate3d(x,y,z)这一行代码使得GPU去渲染动画主体所在的层 而并非CPU 所以一定程度上提高了动画的速度 各大浏览器对于GPU渲染过程并没有一个清晰明了的概念 于是我参照了唯一较为详细叙述整个流程的一篇文章GPU accelerated compositing in chrome

网页渲染过程

关于Chrome浏览器渲染网页的过程及其与GPU的关系 可以总结出以下三点:

    DOM中的每个节点都直接或间接地对应一个层

    一些层有自己的支撑平面(backing surface) 这些层被称为复合层(compositing layers)

    对于复合层(compositing layers)来说compositor是利用GPU将它最终渲染到屏幕上的

复合层形成条件

而形成由GPU渲染的复合层(compositing layers) 需要满足以下条件之一:

    这个层对应的元素里有<canvas>

    这个层里的元素使用了CSS动画去改变透明度或者使用了-webkit-transform属性

    这个层里的元素使用了CSSfilter

Tips

对于那些即将参与CSS动画的HTML元素 可以加上will-change这个属性 使浏览器提前有所准备 但是注意不能滥用

当需要不断改变一个元素的位置时 最好的方式是使用transform: translate3d(x,y,z)

我们还可以参照csstriggers这个网站去查看我们使用的单个的CSS属性会给浏览器带来哪些工作量

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 译者序:原文GPU Animation: Doing It Right,发表于2016年12月6日,本文是对该篇的...
    smilewalker阅读 1,675评论 0 8
  • 最近看到一篇关于GPU动画的神文,原文地址:https://www.smashingmagazine.com/20...
    purple_force阅读 3,523评论 1 6
  • CSS3动画应用很广,尤其是在H5项目中,炫酷的交互效果可以给产品带来更好的体验,更能吸引用户。然而在应用的时候,...
    UIleader阅读 2,264评论 0 7
  • 看了很多视频、文章,最后却通通忘记了,别人的知识依旧是别人的,自己却什么都没获得。此系列文章旨在加深自己的印象,因...
    DCbryant阅读 1,905评论 0 4
  • 试想一下,你刚生了孩子,在病床躺着,先生想给你煮碗鸡汤,这才发现燃气打不燃,自己从未学过点火生炉子,进而把门把手什...
    月如悠尘阅读 573评论 8 3