GPU 加速 CSS 动画与 SVG 原生动画

Posted

技术标签:

【中文标题】GPU 加速 CSS 动画与 SVG 原生动画【英文标题】:GPU accelerated CSS animation vs SVG native animations 【发布时间】:2014-10-03 16:32:53 【问题描述】:

我的问题是,什么是更快的原生 SVG 动画标签,例如:

<path d="something very long and non-human-friendly">
    <animateTransform attributeName="transform" attributeType="XML"
    type="rotate" from="0" to="360" begin="0s" dur="3s" fill="freeze"
    repeatCount="indefinite" />
</path>

或 CSS 动画,例如:

path 
    animation: foo 3s ease-out infinite;


@keyframes foo 
    50% 
        transform: rotate(360);

也许最好使用 SVG 动画,因为 SVG 有更好的浏览器支持?

还相关:由于 CSS 转换触发硬件加速,我还想知道原生 SVG 动画标签是否也触发 GPU 加速或由浏览器绘制。如果没有,是否可以强制硬件对 SVG 原生动画进行控制?

干杯!

【问题讨论】:

它们都是一样的。 UA 通常有一个动画引擎,可以同时执行这两种动画。 注意:UA = 用户代理 = Web 浏览器。 @RobertLongson:我注意到 JS CSS 更新会导致速度较慢的 PC/平板电脑上的抖动,而 似乎更流畅。这是否意味着 JS 操作不使用动画引擎? 正确。它无法加速,因为 UA 不知道未来会发生什么。 @AlvinK。那么 CSS 转换是由 UA 执行的吗?我认为它们是硬件加速的。我有一个带有 SVG 的页面,它使用 SVG 标签在其中设置一条路径的动画,然后在页面下方,我有一个使用 CSS 转换动画的 div:translate。没有 JS。当我滚动页面时,当我到达 SVG 时它会减慢一点绘画速度,但当我到达 div 时它会正常滚动。这就是为什么我问,如果 SVG 标签更慢或者不能被硬件加速,我打算用 CSS 转换来动画化 SVG 内部的路径。 PS。 SVG 不是 DOM 的一部分,它作为外部图像嵌入。 @RobertLongson:通常说包含&lt;animate&gt; 的外部SVG 是由动画引擎渲染的吗?虽然我注意到带有“动画”标签的嵌入式 SVG 确实在 UA 上运行得更快,但无法通过源代码进行确认。 【参考方案1】:

截至 2019 年,情况仍然很不明朗。

在所有情况下,性能都有了很大的发展。

在高负载时,为了避免界面滞后,在大量使用 javascript 引擎时,我发现 SVG 在加载和渲染时比 css 动画更快,并且在调整窗口大小或缩放。还针对js动画画布。

本机动画 svg 和 js 动画 svg 都是这种情况。

这真的取决于设备。

不管怎样,这一切都不是固定的。当我在 Linux 上开发时,发现我的应用在其他一些相同类型的机器上运行更流畅。

这有一个悲哀的解释,仍然在 Linux/Firefox 66 默认禁用 GPU 加速。通过在 about:config 中启用,渲染和 cpu 使用的性能提升到另一个世界。

在 about:config 中,将以下条目切换为 true:

layers.acceleration.force-enabled

不确定为什么默认禁用它,可能只是许可证问题。这显示了未来改进的剩余空间。

https://community.chakralinux.org/t/how-to-enable-opengl-compositing-in-firefox-for-a-smoother-browsing-experience-with-less-cpu-usage/7543

对于 Linux/chromium,这也是默认禁用的,这需要启用大量操作:

https://www.linuxuprising.com/2018/08/how-to-enable-hardware-accelerated.html

【讨论】:

【参考方案2】:

正如其他人指出的那样,性能取决于执行的软件。尽管如此,知道(正如 JGM.io 所写的)JS 动画被认为提供比 CSS3 动画更高的性能可能会有所帮助。

除了 GSAP 之外,还有一个名为 velocity.js 的动画库,它支持 SVG 动画。以下文章简要介绍了使用velocity.js 制作SVG 动画的原因,以及为什么它比https://davidwalsh.name/svg-animation 的替代品更好(由velocity.js 的创建者Julian Shapiro 撰写)。

因此,如果您的目标是在浏览器/webview/e 中实现最高性能和兼容性,我建议您使用像velocity.js 这样的js 动画库。但也要考虑到性能并不是这种选择的唯一指标。到目前为止,我对velocity.js 的体验非常积极,但是通过选择一个库,您的工作将始终依赖于它。

【讨论】:

【参考方案3】:

由于我的多平台 Phonegap 应用程序出现性能问题,为了简单起见,我阅读了大量有关此主题的内容:

没有人真正知道哪些 CSS 是通用硬件加速的,因为标准实现是碎片化的,看起来 ios 是 CSS 硬件加速的领导者,但你想将最佳体验限制在 market share 上吗?

最后我遇到了this 文章,它试图解释 JS 解决方案具有更好的兼容性和performance。同时添加 CSS 无法实现的功能。 请记住,这两篇文章都是由 GSAP 的创建者撰写的,因此存在偏见,但在尝试过之后我被说服了

上述文章的更详细版本可以在here找到。

【讨论】:

我目前正在做一个同时使用 GSAP 和 CSS 动画的项目。使用 Chrome 作为参考,GSAP 在帧率和 CPU 效率方面都大大优于 CSS 动画,但前提是场景中的所有动画都是 GSAP 并且我们为 GSAP 手动指定了帧率(但请注意,我们还没有使用 GSAP 3)。这让我很震惊,也很失望,但差别很大。如果可以并且性能是一个问题,我建议尽可能使用 GSAP 并避免使用 CSS 动画。【参考方案4】:

目前,似乎还没有关于这个话题的完整答案。

我四处寻找更多信息,答案通常取决于您使用 SVG 的哪种实现方式(嵌入、内联)以及您选择支持的浏览器。

一般来说,浏览器的开发人员倾向于将他们的工作集中在 CSS3 优化而不是 SVG 优化上,因为第一个优化的使用频率更高。

在这个简单的Wikipedia page 中,您可以找到有关当前状态的一些示例和其他详细信息,而Mozilla developer center 上的此页面突出了由于使用CSS transform 而由GPU 加速的转换的不同性能。

【讨论】:

以上是关于GPU 加速 CSS 动画与 SVG 原生动画的主要内容,如果未能解决你的问题,请参考以下文章

是否有 Firefox 相当于 Chrome 的“translateZ(0);”强制 GPU 加速 CSS 动画?

SVG交互动画制作

css gpu加速

svg中不可以使用css 3d动画吗

硬件加速

svg中不可以使用css 3d动画吗?