当前位置: 首页 > Web前端 > JavaScript

从浏览器渲染层面解析css3动效优化原理

时间:2023-03-27 12:47:01 JavaScript

从浏览器渲染层面分析css3动效优化原理本主题:减少页面DOM操作,无需添加一行js代码即可使用CSS实现动效使用绝对定位将DOM与文档流分离,减少页面重排(relayout)使用CSS33D属性启用硬件加速那么,CSS3和动态优化有什么关系呢?本文将从浏览器渲染层面来讲述CSS3动态优化原理。浏览器页面显示进程主页。我们需要了解浏览器页面显示流程:Javascript:主要负责业务交互逻辑。样式:根据CSS选择器,为每个DOM元素匹配对应的CSS样式。布局:具体计算显示在屏幕上的DOM元素的大小和位置。Paint:实现一个DOM元素的视觉效果(颜色、边框、阴影等),一般由多个渲染层完成。Composite:每层绘制完成后,浏览器会将所有层按照合理的顺序合并为一层显示在屏幕上。在本文中,我们将重点介绍Composite过程。浏览器渲染原理在讨论Composite之前,我们需要了解一下浏览器渲染的原理。从这张图中我们可以发现DOM元素和LayoutObjects是一一对应的。一般来说,具有相同坐标空间的LayoutObjects属于同一个PaintLayer(渲染层),可以通过position、opacity、filter等CSS属性创建新的PaintLayer。一些特殊的PaintLayer会被认为是CompositeLayer(复合层/复合层),CompositeLayer有单独的GraphicsLayer(图形层),那些不是CompositeLayer的PaintLayer,会和父层共享一个GraphicsLayer拥有图形层。我们日常生活中看到的屏幕视觉效果可以理解为:由GPU合成的多个位图渲染到屏幕上,而位图的最小单位是像素。如下图:那么如何获取位图,GraphicsLayer起着关键作用,每个GraphicsLayer都有一个GraphicsContext,位图存储在共享内存中,GraphicsContext会负责将位图作为纹理上传到在GPU中,合成渲染由GPU执行。如下图所示:CSS在浏览器渲染层面起到什么作用?大多数人对CSS3的第一印象是可以通过3D(如transform)属性启用硬件加速。很多同学在重构某个项目的时候都会考虑。动画性能问题会倾向于:把2Dtransform改成3Dtransform2。将左(上、下、右)的移动改为3Dtransform,但启用硬件加速的底层原理实际上是将PaintLayer升级为CompositeLayer。使用相同的效果:3D属性启用硬件加速(3d-transform)will-change:(opacity,transform,top,left,bottom,right)使用fixed或sticky定位来应用动画(active)或opacity,transform,filtertransition(active),注意这里的动画和transition需要处于active状态。下面写两段demo代码,带大家实际分析一下demo1。3D属性启用硬件加速(3d-transform).composited{width:200px;高度:200px;背景:红色;transform:translateZ(0)}composited-3dtransform

可以看到,因为使用的CSS3D变换创建了一个Composite层demo2。应用animation(active)或transition(active)复合动画
这里我们定义了两个关键帧(移动、不透明度)和两个类(都是,move),最初是#compositedclassName='both',延迟5秒后,className='move',我们看看浏览器中的实际变化一开始:#composited创建了一个合成层,而fps没有运动时有波动,性能稳定5秒后:复合层消失,运动时fps抖动,性能不稳定。如何查看合成层和fps在浏览器的DevTools中选择Moretools,在Rendering中勾选FPSmeter动画性能优化之前我们提到页面中已经呈现的渲染管线,其实在性能方面,理想的渲染管线没有布局和绘图环节。为了达到上述效果,需要只使用那些只触发Composite的属性。目前,只有两个属性满足此条件:transforms和opacity(仅部分浏览器支持)。相关资料可以参考:cssTriggers总结升级到合成层有以下好处:合成层的位图会由GPU合成,比CPU处理速度更快。当需要重绘时,只需要重绘本身,不影响其他图层。对于变换和不透明效果,某些浏览器不会触发Layout和Paint。相关资料可以参考:cssTriggers缺点:创建一个新的复合层不是免费的,它会消耗额外的内存和管理资源。纹理上传后,会被GPU处理,所以我们还需要考虑CPU和GPU之间的带宽,以及有多少内存可供GPU处理这些纹理。大多数人喜欢使用3D属性translateZ(0)来执行所谓的硬件加速以提高性能。但是我们还是需要实际分析页面的实际表现,不断完善测试。这才是优化性能的正确方法。参考资料无线性能优化:Composite-淘前端团队欢迎关注傲兔实验室博客:aotu.io或关注傲兔实验室公众号(AOTULabs),不定期推送文章。