css逐帧动画图片太大怎么办,不建议使用 CSS3 keyframe transform 实现逐帧动画

本文探讨了使用CSS3 keyframes与transform实现动画时出现的闪烁问题原因,包括硬件加速与渲染层过多导致的光栅化耗时。提出了通过Canvas逐帧动画优化的方法,并介绍如何进一步优化以减少显存消耗。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

© Young 2018-12-26 21:43

Welcome to My GitHub

一般在使用 CSS3 keyframe transform 实现逐帧动画时,往往会先把逐帧动画图片合成精灵图,然后再使用 transform 改变其位置,这个方法会消耗大量显存(帧数越多,合成的精灵图越大,显存消耗越多),容易出现闪烁的问题。

直接看例子:

以下截图都来自于 OPPO FindX Chrome 远程调试。

42655d9a3bc6cccd3f888f8c0d2c2c67.gif

30618dcb3b2526f11394abbd694ff8cb.png

页面中有50个使用 CSS3 keyfrmae 结合 transform 实现的逐帧动画;

为什么会闪烁,大概是因为 transform 会导致浏览器开启硬件加速,每个动画区域都是一个独立的渲染层;

在调试 工具 的 Layers 中可以看到:

a178380e04ddabfdb2994e5e41dbf909.png

另外还要注意每个独立的渲染层并不仅仅只是显示出来的那一小块区域,而是整个逐帧动画精灵图内容区域,这应该就是为什么例子中的逐帧动画会消耗那么多显存的原因了。

60025f77703550c6a70ade632dbc3b61.png

当选中 Rendering 中的 FPS meter 就可以看到,总消耗显存 130M 左右。

7ccea548ec8249b8dd5a7b1cb8641d46.png

接着再看 Performance:

b27419ec4132cf7b9018460f911988a4.png

97041f9b7d3d22be7768acae664ad51f.png

可以看到因为渲染层太多,光栅化会消耗较长时间,此时页面空白,较长时间的空白就会造成闪烁。

怎么解决这个问题呢?

Canvas逐帧动画

66fe30605c6dbabdd6d497c3c45ddb38.gif

普通的2D Canvas并不是独立的渲染层,渲染区域也仅仅只是显示的那一块区域,并不会消耗太多显存;

c7d504d46fa6d15b2d9a96ea8f123adc.png

720f722042970370d1fc59947cc5123b.png

4f931519ea84221ffd66f5dbed51bc41.png

最后上述 Canvas逐帧动画是可以再优化一下的;

9ea1f2e85c501cce48b0d1a3fb2e005a.png

每次绘制时都是从整个精灵图中选取一部分绘制,这其实是比较耗时的操作;

e042332cdb25477f13da431273642eaf.png

bee176e870a5fd89ea7ace95734cae2c.png

正确的做法应该在精灵图加载完成之后,先从精灵图中拆出每一帧的图片,然后绘制时直接绘制特定帧的图片即可。

这样优化之后,页面中 Paint 阶段的耗时就可以从 10毫秒 减少为 5 毫秒了。

03fc3f91e3e393563f4d910e8313e798.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值