Lottie动画在安卓上运行缓慢

16

我正在使用Airbnb的新库Lottie在我的应用程序中创建动画。

该动画包含一个70 kb的JSON文件和一个328 kb的图像文件夹。该文件夹中有13个小的PNG文件。

按照GitHub仓库的指示,我这样声明我的视图:

    <com.airbnb.lottie.LottieAnimationView
    android:id="@+id/lottie_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    app:lottie_fileName="animation.json"
    android:layout_gravity="bottom"
    app:lottie_loop="false"
    app:lottie_autoPlay="true"/>

然后,在相关的Java类上,我调用:

        mLottieView.setImageAssetsFolder("images");

然而,我有一个问题。动画效果很生硬且缓慢,我的内存使用量猛增。这一切都发生在主线程上,内存从13MB跳到了89MB。

请问是否有解决方法?

谢谢。


我身处同样的境地。会回来查看答案。 - Adam Varhegyi
你能分享一下这个东西以及容器的尺寸吗?还有你所说的“所有这些都发生在主线程上”是什么意思? - Ivan
我的意思是动画本身和位图转换都在主线程上进行,从而使应用程序变得笨重。容器宽度设置为match_parent,高度为wrap_content。以dps为单位,大约为500 x 500。 - Javier Ventajas Hernández
Lottie 的作者在这里:你能在 GitHub 上发布一个问题并附上你的动画吗?我会去看看! - Gabe
mLottieView.useHardwareAcceleration(); 使用此代码。 - Anil Ugale
5个回答

20

文档提到了几个会影响性能的因素:

  • 如果合成没有蒙版或者遮罩,那么性能和内存开销都应该很好。

  • PNG 序列甚至比 GIF 更糟(因为文件大小)。

还有一些通用的 Android/mobile 问题需要考虑:

  • 使用 width="match_parent", height="wrap_content" 组合时,图像会被放大。建议使用 wrap, wrap 或固定尺寸。
  • PNG 图片上的透明度会增加处理的额外开销。

如果你的 UI 线程正在做太多的工作,你可以推迟开始动画吗?如果有这个选项,则 LottieComposition 有诸如 LottieComposition.fromJson() 的静态方法。

你可以在后台线程上手动设置你的合成(然后可以选择创建一个 LottieDrawable 并设置合成)。完成后,您可以切换到 UI 线程并在 LottieAnimationView 上设置 Composition(或 setImageDrawable)。


让我试试这个。 - Vicky

13

我通过使用这两行代码解决了这个问题

  final LottieAnimationView animationView = (LottieAnimationView) findViewById(R.id.animation_view);
  animationView.useExperimentalHardwareAcceleration(true);
  animationView.enableMergePathsForKitKatAndAbove(true);

更新 03-2021(为了避免您必须深入评论区)

// deprecated
animationView.useExperimentalHardwareAcceleration(true)

// it was this for a bit, but now this is removed too
animationView.useHardwareAcceleration(true)

// confirmed this works on Lottie 3.2.0
animationView.setRenderMode(RenderMode.HARDWARE)

这些功能仍然是实验性的吗? - Javier Ventajas Hernández
3
您可以使用animationView.useHardwareAcceleration(true);代替。该实验性方法目前已被标记为“已弃用(deprecated)”。使用版本为2.2.3 - Ionut Negru
对我来说,它搞乱了动画。 - Ionut Negru
这个已经不存在了吗?在3.2.2中,useExperimentalHardwareAccelerationuseHardwareAcceleration都不可用。 - behelit
1
@behelit:它已被替换为..将enableHardwareAcceleration 替换为新的setRenderMode API,因为它有第三个(自动)选项。更多信息请参考文档。 - Monster Brain
显示剩余2条评论

2

针对您提到的“小图像”和内存消耗问题,我已经回答过一个类似的问题:

使用具有大量透明区域的png图片时内存消耗急剧上升

请不要被328kb图像文件夹所迷惑。在内存中,这些图像将占用更多空间。这也是您的内存消耗跳动的原因。

在动画期间分配和垃圾收集如此大量的位图将始终伴随着停顿。


0

有点奇怪的是,在一个抽屉布局下面并且在一个工具栏里面进行测试很糟糕,但这对我有效。

我还没有尝试在其他设备上使用它,但在一个物理的安卓12上,它对我来说非常好用。

<com.airbnb.lottie.LottieAnimationView
                app:lottie_renderMode="software"

0
对于使用Lottie React Native的人来说,你可以传递这两个属性来使用硬件加速。这解决了我在Android上的性能问题。
<Lottie
  {...otherProps}
  renderMode="HARDWARE"
  hardwareAccelerationAndroid={true}
/>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接