搜索
首页web前端css教程CSS动画的硬件加速介绍

CSS动画的硬件加速介绍

在过去的几年中,我们经常听到有关硬件加速度以及它如何有助于改善网页上的动画,即使在移动浏览器上也使它们变得既友善又光滑。但是我认为许多经验不足的开发人员不知道硬件加速度的工作原理以及我们如何正确使用它来使动画发光。

>

>术语本身听起来像是过于复杂的,接近更高的数学。在本文中,我将阐明此主题,并演示如何在您的前端项目中使用此技术。

钥匙要点

硬件加速度可以显着提高CSS动画的质量,使其更顺畅,更有效,尤其是在移动浏览器上。这是通过将渲染过程卸载到GPU(图形处理单元)来实现的,该过程更好地用于此类任务。 CSS变换是对GPU友好的属性,可用于避免昂贵的重新粉刷操作。 “变换黑客”也可以用来强制迫使元素在动画开始之前在GPU中渲染,从而触发硬件加速度。
    >应该谨慎使用硬件加速度,因为它可能导致内存问题,尤其是在移动设备上。由于GPU和CPU的不同渲染机制,它也可能影响字体抗缩放。
  • >已引入“ Will-Change”属性,以告知浏览器哪些属性将要更改,以便浏览器可以事先进行相应的优化。但是,并非所有浏览器都支持此属性。
  • 我为什么要关心?
  • >
  • >让我们看一个简单的动画示例,其中包含几个堆叠在彼此的球(也就是说,在z轴上,看起来像一个球)。目的是用动画移动这组球。最简单的方法是调整左和顶部属性。我们可以使用JavaScript执行此操作,但是我们将使用CSS动画。请注意,我不包括任何供应商前缀,但您应该使用诸如autoprefixer之类的东西来确保完全兼容。
  • >
这是一个实时演示,它使用按钮使用JavaScript启动动画:

>请参阅codepen上的sitepoint(@sitepoint)的钢笔与顶部/左属性重叠的球。

>单击“启动动画”按钮后,您会注意到,即使在桌面浏览器上,动画看起来也不是非常平滑的。如果您在移动设备上测试动画,则会发现它远非60fps。为了解决此问题,我们可以使用Translate()函数使用CSS变换,而不是对顶部和左值进行动画。

<span><span>.ball-running</span> {
</span>  <span>animation: run-around 4s infinite;
</span><span>}
</span>
<span><span>@keyframes run-around</span> {
</span>  <span>0%: {
</span>    <span>top: 0;
</span>    <span>left: 0;
</span>  <span>}
</span>
  <span>25% {
</span>    <span>top: 0;
</span>    <span>left: 200px;
</span>  <span>}
</span>
  <span>50% {
</span>    <span>top: 200px;
</span>    <span>left: 200px;
</span>  <span>}
</span>
  <span>75% {
</span>    <span>top: 200px;
</span>    <span>left: 0;
</span>  <span>}
</span><span>}</span>
在下面的演示中尝试以上代码:

请参阅用codepen上的sitepoint(@sitepoint)的CSS变换的CSS转换的笔动画。

现在,动画很好。伟大的!那么为什么这会有所帮助呢?好吧,与左和顶部属性的动画不同,CSS变换不会引起重新粉刷。让我们看一下动画执行期间Chrome Devtools中的时间轴面板:

CSS动画的硬件加速介绍

>在左和顶级示例中,我们可以在每个动画步骤中看到绿色条。这是一个昂贵的重新粉刷操作。动画帧速率小于60fps,我们始终旨在使动画变得平稳。

现在查看CSS转换的时间表:>

如您所见,动画期间没有绿色条。>

> Chrome的DevTools中可用的另一个功能以跟踪重新粉刷过程是“启用油漆闪烁”。您可以通过打开DevTools,键入ESC键,然后选择“渲染”选项卡来找到此选项。当打开此功能时,绿色框(即油漆矩形)将出现在重新粉刷的区域周围。在左和顶部的示例中,球有一个用于整个动画过程的绿色盒子,指示重新涂片。CSS动画的硬件加速介绍

另一方面,在CSS转换示例中,油漆矩形仅显示在第一个也是最后一个动画帧上。

>那么,如何确切地改变没有重新粉的动画?基本答案是,CSS变换直接出现在使用硬件加速度的GPU

内存中,从而避免了软件渲染。让我们更详细地看一下。CSS动画的硬件加速介绍

硬件加速度的工作方式

>浏览器收到页面标记时,它将其解析以构建DOM树。 DOM树和CSS允许浏览器构建渲染树。渲染树由渲染对象组成 - 页面上要渲染的元素。每个渲染对象都分配给图形层。每层都将其上传到GPU作为纹理。这里的诀窍是,该层可以在不重新粉刷的情况下在GPU中转换,就像3D图形一样。这些转换是由单独的合成过程进行的。您可以在此处找到有关Chrome中构图的更多信息。

> 在我们的示例中,CSS变换创建了一个可以直接在GPU中转换的新复合层。 Chrome的DevTools允许使用“显示层边框”选项查看复合层。每个复合层都有一个橙色边框。

我们与CSS转换的球具有橙色边界,并移动到单独的复合层:

CSS动画的硬件加速介绍

在这一点上,您可能会问:浏览器何时创建一个单独的复合层?

在以下情况下这样做:

>

对于3D或透视CSS变换(在我们的示例中)
    >
  • elements
  • 使用CSS过滤器
  • 对于一个元素,该元素与提取到复合​​层的另一个元素重叠(例如,使用z index)
  • >
  • 您可能会在想,‘坚持下去。此示例使用2D翻译,而不是3D变换。你是对的。这就是为什么有两个额外的重新粉刷操作 - 在我们的时间表中动画过程的开始和结束时。

CSS动画的硬件加速介绍3D和2D变换之间的区别在于3D变换使浏览器事先创建一个单独的复合层,而2D变换则可以飞行。在动画开始时,创建了一个新的复合层,并将纹理加载到GPU上,该GPU启动重新粉刷。然后,动画由GPU中的合成器执行。动画完成后,将删除附加的复合层,从而导致另一个重新粉刷的操作。

> gpu

中的渲染元素

并非所有CSS属性上的元素都可以直接在GPU中处理。仅支持以下属性:

>变换

    不透明度
  • >过滤
  • 为了确保获得平滑,高质量的动画的最佳机会,我们应该始终尝试使用这些gpu友好的属性。
  • 强迫要在gpu
中渲染的元素 在某些情况下,即使在动画开始之前,也可能需要在GPU中呈现一个元素。这有助于避免由新层创建引起的首次重新粉刷操作。为了实现这一目标,所谓的“转型黑客”可能会派上用场。

>

>这是让浏览器知道我们要执行3D变换。这使得浏览器创建一个单独的图层并事先将元素移至GPU,从而触发硬件加速度。 由于其背后的另一个元素的重新粉刷过于昂贵时,此技术也很有用。让我们回到第一个示例,然后稍微更改它,以便它包含一个单个球和一个使用CSS滤镜模糊的背景图像的容器。球具有左侧和顶部特性的动画。

请参阅codepen上的sitepoint(@sitepoint)用顶部/左属性的球动画。

<span><span>.ball-running</span> {
</span>  <span>animation: run-around 4s infinite;
</span><span>}
</span>
<span><span>@keyframes run-around</span> {
</span>  <span>0%: {
</span>    <span>top: 0;
</span>    <span>left: 0;
</span>  <span>}
</span>
  <span>25% {
</span>    <span>top: 0;
</span>    <span>left: 200px;
</span>  <span>}
</span>
  <span>50% {
</span>    <span>top: 200px;
</span>    <span>left: 200px;
</span>  <span>}
</span>
  <span>75% {
</span>    <span>top: 200px;
</span>    <span>left: 0;
</span>  <span>}
</span><span>}</span>
>再次,球运动是生干的。发生这种情况是因为每个重新粉刷的操作都由于背景模糊。

现在,让我们将转换hack添加到容器中。

>

>请参阅codepen上的sitepoint(@sitepoint)的硬件加速的左/顶部属性。

结果还不错,动画效果很好。为什么?因为现在变模的价格昂贵的背景已移至另一个复合层,并且每个动画步骤的重新粉刷都很便宜。

>

使用谨慎的硬件加速度

>没有免费的。有一些与硬件加速有关的问题。

>

内存
最重要的问题与内存有关。为GPU加载太多纹理可能会导致内存问题。这在移动设备上确实至关重要,甚至可能崩溃移动浏览器。介意后果,不要为页面上的每个元素使用硬件加速度。

>字体渲染

GPU的渲染会影响字体抗叠叠。发生这种情况是因为GPU和CPU具有不同的渲染机制。因此,即使您在动画结束时关闭硬件加速度,在动画过程中将显示文本模糊。您可以在基思·克拉克(Keith Clark)的这篇文章中阅读有关字体渲染问题的更多信息。
不久的将来

>使用“变换黑客”创建单独的复合层的必要性很麻烦。浏览器绝对应该提供一种直接的方法来实现这一目标。这就是为什么引入了Will-Change属性的原因。此功能使您可以通知浏览器哪些属性将要更改,因此浏览器可以事先进行相应的优化。这是一个告知浏览器的示例,将更改转换属性:>

不幸的是,并非所有浏览器都支持Will-Change。您可以在以下资源中了解有关Will-Change的更多信息:

<span><span>.ball-running</span> {
</span>  <span>animation: run-around 4s infinite;
</span><span>}
</span>
<span><span>@keyframes run-around</span> {
</span>  <span>0%: {
</span>    <span>top: 0;
</span>    <span>left: 0;
</span>  <span>}
</span>
  <span>25% {
</span>    <span>top: 0;
</span>    <span>left: 200px;
</span>  <span>}
</span>
  <span>50% {
</span>    <span>top: 200px;
</span>    <span>left: 200px;
</span>  <span>}
</span>
  <span>75% {
</span>    <span>top: 200px;
</span>    <span>left: 0;
</span>  <span>}
</span><span>}</span>
> CSS Will-Crange属性的简介nick salloum

您需要了解的有关CSS Will-Crange属性的所有信息。
  • 结论
  • 总结我们涵盖的内容:

>使用GPU可以提高动画的质量

在每个设备上,GPU渲染的动画应为60fps >

使用gpu友好的CSS属性

    >了解如何使用“变换黑客”强制构成在GPU中渲染的元素。
  • 如果您使用了这些技术或有任何反馈,请随时提供您的评论。

    经常询问有关硬件加速和CSS动画的问题

    > GPU在硬件加速CSS动画中的作用是什么?它负责渲染图形和图像处理。当CSS动画被硬件加速时,GPU接管了中央处理单元(CPU)渲染动画的任务。由于GPU专门设计用于处理此类任务,因此这会导致更流畅,更快,更有效的动画。

    >

    >硬件加速如何改善CSS动画的性能?通过从CPU到GPU的某些图形处理任务来卸载CSS动画。这使CPU可以专注于其他任务,从而提高网站或应用程序的整体性能。此外,GPU可以更好地处理图形任务,从而使动画更顺畅,更有效。可以大大提高性能,存在潜在的缺点。主要问题之一是兼容性问题。并非所有设备或浏览器都支持硬件加速度,这可能导致不一致的用户体验。此外,过度使用硬件加速可能会导致功耗增加,这可能是移动设备的问题。

    >

    >我如何启用CSS动画的硬件加速度?

    启用CSS动画的硬件加速度可以通过在CSS代码中使用“变换”属性来完成。该属性触发GPU接管动画的渲染。例如,您可以使用'transform:transforatez(0)'或'变换:旋转(0deg)'来启用硬件加速度。

    哪种类型的CSS动画最大程度地从硬件加速器中受益? > CSS动画涉及复杂的图形任务,例如3D变换,过渡和关键帧动画,可以从硬件加速度中受益匪浅。当通过CPU处理时,这些任务可能是资源密集的,但是GPU可以更有效地处理它们,从而产生更顺畅的动画。

    >在使用硬件加速CSS动画时,我如何确保兼容性? 🎜>要确保使用硬件加速CSS动画时的兼容性,在各种设备和浏览器上测试您的网站或应用程序很重要。您还可以在CSS代码中使用后备为不支持硬件加速的设备或浏览器提供替代动画。

    >

    >可以与CSS过渡一起使用硬件加速度?通过使用“变换”属性,您可以触发GPU呈现过渡,从而产生更顺畅,更有效的动画。

    >

    >硬件加速度如何影响移动设备上的电池寿命?尽管硬件加速可以提高CSS动画的性能,但它也可以增加功耗,从而可能影响移动设备上的电池寿命。在使用硬件加速时,在性能和功耗之间取得平衡很重要。

    >我可以将硬件加速器用于2D动画吗?

    是的,可以将硬件加速器用于2D动画。通过在CSS代码中使用“变换”属性,您可以触发GPU渲染动画,从而产生更顺畅,更有效的动画。

    >

    >如何优化我的CSS代码以进行硬件加速度? >

    优化用于硬件加速的CSS代码涉及使用“转换”属性触发GPU进行渲染动画。避免过度使用硬件加速度也很重要,因为这可能导致功耗增加。此外,在各种设备和浏览器上测试您的网站或应用程序可以帮助确保兼容性。

以上是CSS动画的硬件加速介绍的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
迭代使用样式组件的React设计迭代使用样式组件的React设计Apr 21, 2025 am 11:29 AM

在一个完美的世界中,我们的项目将拥有无限的资源和时间。我们的团队将开始使用经过深思熟虑的UX设计进行编码。

哦,制作三角形面包丝带的许多方法!哦,制作三角形面包丝带的许多方法!Apr 21, 2025 am 11:26 AM

哦,制作三角形面包屑丝带的许多方法

CSS指南中的SVG属性CSS指南中的SVG属性Apr 21, 2025 am 11:21 AM

SVG具有自己的一套元素,属性和属性集,以至于内联SVG代码可能会变得漫长而复杂。通过利用CSS和SVG 2规范的一些即将到来的功能,我们可以减少该代码以进行清洁标记。

交叉观察者的一些功能用途可以知道何时在元素中查看交叉观察者的一些功能用途可以知道何时在元素中查看Apr 21, 2025 am 11:19 AM

您可能不知道这一点,但是JavaScript最近偷偷地积累了许多观察者,而交叉观察者是其中的一部分

恢复偏爱减少运动恢复偏爱减少运动Apr 21, 2025 am 11:18 AM

我们可能不需要扔掉所有CSS动画。请记住,这更喜欢减少动作,而不喜欢不运动。

如何将进步的Web应用程序进入Google Play商店如何将进步的Web应用程序进入Google Play商店Apr 21, 2025 am 11:10 AM

PWA(Progressive Web应用程序)已经与我们在一起了一段时间。但是,每次我尝试向客户解释它时,同样的问题都会出现:“我的用户会成为

处理HTML的最简单方法包括处理HTML的最简单方法包括Apr 21, 2025 am 11:09 AM

这对我来说非常令人惊讶,HTML从未在其中包含其他HTML文件。似乎也没有任何东西

更改悬停在悬停的SVG的颜色更改悬停在悬停的SVG的颜色Apr 21, 2025 am 11:04 AM

使用SVG有很多不同的方法。取决于哪种方式,在不同状态或条件下重新定制该SVG的策略 - 悬停,

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

Video Face Swap

Video Face Swap

使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热工具

螳螂BT

螳螂BT

Mantis是一个易于部署的基于Web的缺陷跟踪工具,用于帮助产品缺陷跟踪。它需要PHP、MySQL和一个Web服务器。请查看我们的演示和托管服务。

Dreamweaver Mac版

Dreamweaver Mac版

视觉化网页开发工具

SublimeText3 Mac版

SublimeText3 Mac版

神级代码编辑软件(SublimeText3)

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript开发工具