Lottie 中文文档 下载 App

Lottie 播放卡顿——帧率低、掉帧、内存泄漏

先定位:是哪一端卡

卡顿问题有三种类型,排查方向不同:

类型表现排查方向
设备帧率低整个界面卡,包括非 Lottie 区域设备性能 / 渲染器 / 动画复杂度
Lottie 独占卡顿停播 Lottie 就恢复流畅动画本身 / SDK 版本
内存泄漏页面退出后内存不释放,下次进来更卡代码实现 / 生命周期管理

动画本身导致的卡顿

图层数量过多

一个动画里图层数量超过 100 层时,每一帧都需要遍历所有图层并计算属性变化——这个开销在低端 Android 和老款 iOS 上会很明显。

解决:

位图图层过大

动画里如果用了 2000x2000 以上的位图,每帧都要解码和缩放。位图在不同像素密度的屏幕上表现还不一致。

解决:位图最大控制在 500x500 以内;能全部用矢量就全部用矢量。

表达式没清理干净

如果 JSON 里还残留了表达式("ty": "expr" 类型的节点),渲染引擎每帧都要执行表达式——这比纯关键帧动画慢很多。

检查:用文本编辑器打开 JSON,搜索 "exp" 或 "expressions" 字段——如果有,回到 AE Convert to Keyframes 重新导出。

渲染器选择

Web 端

切换方式:

lottie.loadAnimation({ renderer: 'canvas', /* ... */ });

Android 端

iOS 端

lottie-ios 默认用 Core Animation 渲染——性能没问题。但:

内存泄漏

典型场景

场景泄漏点
React / Vue 组件卸载effect 里没调 anim.destroy()
Activity / Fragment 退出LottieAnimationView 的 onDetachedFromWindow 没停播
RecyclerView ViewHolder 复用同一个 LottieAnimationView 反复设置不同动画但没 cancel
远程 URL 加载Composition 被 Lottie 内部缓存但不释放

原则

谁创建动画,谁负责销毁:

// React useEffect 里
useEffect(() => {
  const anim = lottie.loadAnimation({ /* ... */ });
  return () => anim.destroy(); // 必须清理
}, []);
// Android Fragment
override fun onPause() {
    super.onPause()
    animationView.cancelAnimation()
}
override fun onDestroyView() {
    super.onDestroyView()
    animationView = null // 释放引用
}

检查方式