使用CSS3开启GPU硬件加速提升网站动画渲染性能

news/2024/5/20 13:20:44/文章来源:https://blog.csdn.net/weixin_33750452/article/details/93136792

遇到的问题:

  网站本身设计初衷就没有打算支持IE8及以下版本浏览器,并不是因为代码兼容性问题,而是真的不想迁就那些懒得更新自己操作系统和浏览器的用户,毕竟是我自己的网站,所以我说了算!哈哈~

  没有了低版本IE6浏览器,就不用顾虑他们的性能问题了,本以为开发会一帆风顺,结果”性能问题”竟然出现在了一直以性能出色著称的Chrome浏览器中。

  Chrome下的动画比IE9和FF都要慢很多,一开始觉得是自己的js逻辑问题,因为要遍历9个元素并计算他们的坐标。后来尝试了使用requestAnimationFrame、webWorker和canvas,但情况仍然没有任何好转。通过chrome的DevTool中TimeLine监控,发现动画的代码逻辑并没有占用太多资源,反倒是painting消耗了大量的时间,平均才30fps左右。

chrome_timeline_frames_30fps chrome_timeline_frames_30fps

chrome_timeline_frames_30fps
上图可见主要时间都浪费在painting上了,元素背景图过大导致。

chrome_timeline_frames_30fps
chrome_timeline_frames_30fps

  上面这几张图都是开启GPU硬件加速之前使用Chrome DevTool Timeline功能中Frames模块监测到的数据,明显看到平均帧速率在30fps左右

  其实,chrome对于渲染多张大尺寸图片方面一直表现疲软,之前在开发人人小站瀑布流布局模板的时候就遇到过这类问题,chrome中只要存在大量缩放图片,页面滚动的时候就会极其卡顿,就像是用一台2004年的电脑访问一个2014年的网站一样。chrome对于渲染很多大尺寸图片(尤其是alphy透明度PNG24图片)方面有先天的不足,从它版本10+的时候就有开发者在官方平台报过这个Bug,如今chrome已经更新至版本30+,却依旧没有完美解决这个顽疾。

解决Chrome动画”卡顿”的办法

  为动画DOM元素添加CSS3样式-webkit-transform:transition3d(0,0,0)或-webkit-transform:translateZ(0);,这两个属性都会开启GPU硬件加速模式,从而让浏览器在渲染动画时从CPU转向GPU,其实说白了这是一个小伎俩,也可以算是一个Hack,-webkit-transform:transition3d和-webkit-transform:translateZ其实是为了渲染3D样式,但我们设置值为0后,并没有真正使用3D效果,但浏览器却因此开启了GPU硬件加速模式。

  这种GPU硬件加速在当今PC机及移动设备上都已普及,在移动端的性能提升是相当显著地,所以建议大家在做动画时可以尝试一下开启GPU硬件加速。

当然也可以这样开启所有浏览器的GPU硬件加速:

webkit-transform: translateZ(0);
-moz-transform: translateZ(0);
-ms-transform: translateZ(0);
-o-transform: translateZ(0);
transform: translateZ(0);

webkit-transform: translate3d(0,0,0);
-moz-transform: translate3d(0,0,0);
-ms-transform: translate3d(0,0,0);
-o-transform: translate3d(0,0,0);
transform: translate3d(0,0,0);

 

  使用-webkit-transform:transition3d(0,0,0)开启GPU硬件加速的chrome中渲染动画性能明显顺畅了许多,平均能达到55fps左右。无图无真相:

chrome_timeline_frames_60fps
chrome_timeline_frames_60fps
chrome_timeline_frames_60fps
开启GPU硬件加速前后帧速率对比
开启GPU硬件加速前后帧速率对比图(点击查看清晰大图)

chrome诡异的Bug

  对所有动画DOM元素添加-webkit-transform:transition3d(0,0,0)开启GPU硬件加速之后,又出现了一个chrome诡异的Bug,当你有多个position:absolute;元素添加-webkit-transform:transition3d(0,0,0);开启GPU硬件加速之后,会有几个元素凭空消失,调试许久无果遂Google之,国内暂时没有人发表过关于这类问题的文章,于是在国外网站找呀找,找到了很多与我遇到同样问题的人,但都没有真正靠谱的解决办法,这可能是跟添加-webkit-transform之后chrome尝试使用GPU硬件加速有关系,最后还是要等待Chrome官方更新解决了,当前Chrome版本是33。如果谁发现比较好的解决办法,欢迎提出^_^

其他人遇到的类似问题:
3D CSS transform: translateZ causes elements to disappear in Chrome
Fixed attachment background image flicker/disappear in chrome when coupled with a css transform

如何避免这个问题:

  在使用-webkit-transform尝试对很多DOM元素编写3D动画时,尽量不要对这些元素及他们的父元素使用position:absolute/fixed。(其实这种情况很难避免)
所以我的临时解决办法是,减少使用-webkit-transform:transition3d(0,0,0)的DOM元素数量,从9个减至6个便没有元素消失的现象了。
PS:由于测试环境有限,如果大家发现在你的浏览器还有这个Bug,麻烦留言告诉我,万分感谢!

开启GPU硬件加速可能触发的问题:

通过-webkit-transform:transition3d/translateZ开启GPU硬件加速之后,有些时候可能会导致浏览器频繁闪烁或抖动,可以尝试以下办法解决之:

-webkit-backface-visibility:hidden;
-webkit-perspective:1000;

如何监测动画帧速率

推荐两种实时监测网页渲染帧速率的方法:

1.Chrome的DevTool中TimeLine的Frame模块
chrome_timeline_frames

2.地址栏输入”chrome:flags”搜索”fps”,将”FPS计数器”开启,浏览器重启后右上角会实时显示帧速率。
chrome_fps_counter

我会再过些天单独写一篇关于通过Frame模块监测网站性能的教程,敬请留意^_^

通过-webkit-transform:transition3d/translateZ开启GPU硬件加速的适用范围:

  • 使用很多大尺寸图片(尤其是PNG24图)进行动画的页面。
  • 页面有很多大尺寸图片并且进行了css缩放处理,页面可以滚动时。
  • 使用background-size:cover设置大尺寸背景图,并且页面可以滚动时。(详见:https://coderwall.com/p/j5udlw)
  • 编写大量DOM元素进行CSS3动画时(transition/transform/keyframes/absTop&Left)
  • 使用很多PNG图片拼接成CSS Sprite时

我能想到的暂时只有这五种情况,欢迎大家补充。

总结:

  通过开启GPU硬件加速虽然可以提升动画渲染性能或解决一些棘手问题,但使用仍需谨慎,使用前一定要进行严谨的测试,否则它反而会大量占用浏览网页用户的系统资源,尤其是在移动端,肆无忌惮的开启GPU硬件加速会导致大量消耗设备电量,降低电池寿命等问题。

您还可以参考以下HTML5相关文章:
《人人网首页拖拽上传详解(HTML5 Drag&Drop、FileReader API、formdata)》
《HTML5 Drag&Drop 拖拽、FileReader实例教程》
《关于HTML 5 canvas 的基础教程》

 PS:http://blog.bingo929.com/transform-translate3d-translatez-transition-gpu-hardware-acceleration.html(感谢彬GO)

转载于:https://www.cnblogs.com/zytrue/p/8493793.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_738779.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

织梦怎么样备份网站

很多用织梦的朋友不知道怎么备份网站,还有些朋友备份网站的方式不对。当遇到网站被黑、服务器到期等关键时刻,导致数据丢失,网站不能用。新搭建网站就得一切从头再来,找技术恢复,又是一笔不小的开支。这是一种无形的损…

19期-当你在百度搜索关键字的时候,哪个网站会排在最前面?今天给大家科普一下“网站SEO”

前言 什么是SEO呢?SEO是Search Engine Optimization,意为“搜索引擎优化”,一般简称为搜索优化。对于SEO的主要工作就是通过了解各类搜索引擎如何抓取互联网页面,如何进行索引以及如何确定其对某一个特定关键词的搜索结果排名等技…

工具网站

http://tool.oschina.net/

技术整合网站

表格功能实现 1.阿里的easyexecl 数据导出功能实现 https://blog.csdn.net/weixin_38546942/article/details/87878983 2.Apache POI的实现方式 https://www.cnblogs.com/huajiezh/p/5467821.html

网站访问出现 ------ Can not write to cache files, please check directory ./cache/ .

2019独角兽企业重金招聘Python工程师标准>>> 最近在搞微商城时,突然出现了Can not write to cache files, please check directory ./cache/ .这样一个提示, 但最近好像没搞什么大动作,怎么回事,经过一番折腾&#xff…

从运维角度看中大型网站架构的演变之路

一个成熟的网站架构并不是一开始设计就具备高可用、高伸缩、高性能等特性的,它是随着用户量和业务线不断增加,基础架构才逐渐健壮的。在发展初期,一般都是从0到1,不会一上来就整一些大而全的架构,也很少人这么任性。说…

网站作业不能粘贴

前两天学校发了一个网上作业,然后就想从网上找点东西借鉴一下,但是网站不让粘贴 又正好最近在学网站制作,就想尝试一下能否绕过这个这个。下面是尝试的几种方法。 直接禁止js 这是第一想法,直接禁止他的js运行, 果然能…

从零开始建站(四) - 后端项目搭建

简介: 这节聊一聊项目的后端,之前也讲过,因为对前端不熟悉,所以在前端花了太多的时间,导致到后端开发的时候搞的人有点疲,所以很多东西从简了,很多细节东西没有考虑,只想着把基本功能…

Ubuntu Nginx下配置网站ssl实现https访问

为什么80%的码农都做不了架构师?>>> 最近在看 HTTP权威指南 看到介绍了HTTPS的ssl,自己就动手测试了下,将步骤记录下 HTTPS简介 什么是HTTPS?百科是这样解释的。HTTPS(全称:Hyper Text Tran…

大型网站架构系列:负载均衡详解(1)(转)

面对大量用户访问、高并发请求,海量数据,可以使用高性能的服务器、大型数据库,存储设备,高性能Web服务器,采用高效率的编程语言比如(Go,Scala)等,当单机容量达到极限时,我们需要考虑业务拆分和分…

搜索关键词分析——以个人博客网站为例

背景 我做了一个个人博客网站,希望能够记录自己的学习,工作和成长笔记。同时为更多有相同需求的人提供帮助和支持。那么用户应该怎么来找到我这个博客网站呢?通过什么关键词能够快速找到这个博客网站呢? 接下来本文就来探讨一下关…

基于python的种子搜索网站,你懂得!

该项目是基于python的web类库django开发的一套web网站,给师弟做的毕业设计。本人的研究方向是一项关于搜索的研究项目。在该项目中,笔者开发了一个简单版的搜索网站,实现了对数据库数据的检索和更新。通过开发该项目,笔者学习和巩…

只有登陆注册页需要https加密吗?N网站有必要全站加密吗?

很多人都觉得,HTTPS 可以保护用户的密码等登陆信息,那么其他时候就不需要了。但火狐Firefox浏览器插件Firesheep,证明了这种想法是错的。我们可以看到,其实在一些社交平台,劫持其他人的session是非常容易的。我们以常见…

windwos服务器网站504,打开网站出现504 gateway time-out的原因及解决方法

我们在访问大流量网站或者运营有较多数据的网站时候,偶尔会出现504 GatewayTime-out错误,那么造成504 gateway time-out是什么原因呢?这多是网站服务器配置不当导致的,下面分享一下504 gateway time-out解决方法。1、代码释义504 …

java嵌套其他人网站页面_手把手教你实现Java权限管理系统 前端篇(十五):嵌套外部网页...

嵌套外部网页在有些时候,我们需要在我们的内容栏主区域显示外部网页。如查看服务端提供的SQL监控页面,接口文档页面等。这个时候就要求我们的导航菜单能够解析嵌套网页的URL,并根据URL路由到相应的嵌套组件。接下来我们就讲解具体实现方案。实…

使用Apache JMeter测试网站压力

使用Apache JMeter测试网站压力 一、进入官网下载资源 官网地址:http://jmeter.apache.org/download_jmeter.cgi 提供同版本百度网盘下载: 链接:https://pan.baidu.com/s/1kM3hucZJWwFZpwBFk-2FYA 提取码:0qrf 二、解压资源apach…

centos7 php无法启动服务器,centos7下无法启动ssh服务_网站服务器运行维护,centos7,ssh...

win10文件夹显示一个小一个大怎么办_网站服务器运行维护win10文件夹显示一个小一个大的解决办法:首先进入“我的电脑”,点击上方的“查看”;然后点击界面右边的“选项”;接着在弹出的窗口中选择“查看”;最后选择“应用…

宝塔面板ab模板建站_建站工具篇:在首次建站过程中,我都用到了哪些建站工具?...

工欲善其事,必先利其器。在生活中、在工作中我们经常会使用到一些实用的工具,来帮助我们快速的完成任务,建站也是一样,我们需要利用一些工具来帮助我们快速便捷地搭建网站。下面,跟大家聊聊在建站的过程中我都使用了哪…

速度优化_WordPress网站速度优化指南

使用Wordpress搭建的网站普遍打开速度太慢,针于SEO来讲提升网站打开速度才能获得好的体验。如何提升Wordpress网站打开速度,让WP博客程序实现速度秒开,经过研究实践终于突破了速度这一难题。要提升Wordpress速度需要结合多方面来进行操作&…

java精品课程设计开发_《java语言课程设计》精品课程网站规划和建设.doc

《java语言课程设计》精品课程网站规划和建设.doc 学科类网络工程学号1101010136学校代码13421密级2015届本科生毕业论文JAVA语言程序设计精品课程网站规划与建设学院信息学院专业网络工程姓名宋冬冬指导教师万里勇职称讲师答辩日期二〇一五年四月七日毕业论文诚信声明本人郑重…