如何提升集合栈视图中23个Lottie动画的加载性能?
Lottie动画加载内存&耗时优化方案
1. 降低加载时的内存峰值
- 增加自动释放池包裹动画加载逻辑,及时释放解析JSON过程生成的临时对象,避免老旧设备短时间内无法回收大量临时内存导致溢出
- 错开主线程赋值时机,避免一次性向主队列塞24个UI更新任务导致主线程卡顿,同时降低加载优先级避免和主线程抢计算资源
优化后参考代码:
// 将优先级从.userInteractive下调为.userInitiated,避免抢占主线程资源 DispatchQueue.global(qos: .userInitiated).async { for n in 0...23 { autoreleasepool { guard let animation = Animation.named("box\(n+1)", animationCache: LRUAnimationCache.sharedCache) else { continue } // 每个赋值任务错开50ms,避免主线程阻塞 DispatchQueue.main.asyncAfter(deadline: .now() + Double(n) * 0.05) { self.lottieCollectionViews[n].animation = animation // 非立即播放的动画可以待需要展示时再调用play() } } } }
2. 按需加载避免资源浪费
- 如果24个动画不是进入页面就全部需要展示,仅加载当前屏幕可见区域的动画,其余动画待用户滚动到对应位置、或者需要触发展示时再加载,可将首次加载耗时从5-7秒压缩到1秒以内,内存占用也会下降80%以上
- 多个视图使用相同动画时,直接复用同一个
Animation对象即可,不要重复加载相同的JSON文件
3. 启用Lottie官方缓存
- Lottie自带
LRUAnimationCacheLRU缓存机制,已经解析过的动画会直接从缓存读取,无需重复解析JSON,多次打开同个页面时加载速度会有明显提升
4. 优化动画源文件
- 让设计师导出动画时精简冗余图层、无效关键帧,降低动画本身的计算量
- 将JSON格式的动画转为官方的
.lottie压缩格式,体积可缩小30%以上,解析速度也更快,老旧设备上的加载耗时会进一步降低
5. 降低渲染内存开销
- 不需要透明背景的
AnimationView可将opaque属性设为true,减少渲染时的内存占用 - 动画播放完成后如果不需要回放,可将
animation属性置为nil释放内存资源
内容的提问来源于stack exchange,提问作者Benjamin
相关产品推荐
相关产品推荐

