本文由 简悦SimpRead 转码,原文地址 medium.com
由Core Animation驱动的新的渲染引擎,性能大幅提升
一个新的渲染引擎,在Core Animation的支持下,性能有了很大的提高。
作者: Cal Stephens
Lottie是Airbnb的跨平台、开源库,用于渲染矢量运动图形。我们在Airbnb广泛使用Lottie,它也为整个行业中成千上万的其他应用程序提供动画。
今天我们发布了iOS版的Lottie 4.0。这个重要的新版本为所有Lottie动画带来了大的性能改进,并采用了由Core Animation驱动的全新渲染引擎。
通过多年来对Lottie的大规模使用,我们对其在真实世界中的性能特征有了很多了解。我们发现,在一些比较复杂的屏幕中,Lottie动画掉帧的情况比较普遍。要了解原因,我们首先要看一下Lottie以前是如何渲染动画的。
以前版本的Lottie在应用程序的主线程上播放动画,有效地使用CADisplayLink。每一帧,Lottie会在主线程上执行代码,以推进动画的进展并重新渲染其内容。这意味着动画在播放时将消耗5-20%以上的CPU,从而使应用程序的其他部分可用的CPU周期减少。
用Lottie 3.5.0播放动画,使用原始主线程渲染引擎。
这也意味着,当主线程繁忙时,动画不会更新。这可能导致动画掉帧或完全冻结,从而导致用户体验不佳。
当主线程超载时,Lottie动画会掉帧。
这些问题是使用绑定主线程的渲染架构的固有限制。
在iOS上,播放动画的最高性能和最省电的方式是使用Core Animation。这个系统框架通过GPU硬件加速在进程外渲染动画。动画播放是由一个单独的系统进程管理的,称为 "渲染服务器"。这意味着由Core Animation驱动的动画不会对应用进程本身的CPU利用率产生影响,甚至在其主线程被阻断或繁忙时也能继续。
在整个2022年,我们一直在为Lottie开发一个建立在Core Animation之上的新渲染引擎实现。对于动画JSON文件中的每一个层,新引擎都会建立一个 CALayer,并为该层的动画属性应用 CAAnimation 的关键帧。Lottie将这些动画关键帧传递给Core Animation,Core Animation负责在屏幕上实际渲染它们,并在每一帧中更新动画。
这个新引擎消除了播放Lottie动画的CPU开销,有效地保证了Lottie动画在60或120帧的速度下流畅地播放,而不受应用程序的CPU负载影响。
用Lottie 4.0播放一个动画,使用新的核心动画渲染引擎。
由于新引擎渲染的动画不会在应用程序的主线程上执行任何代码,应用程序现在有更多的资源可用于其他功能。这在运行CPU负载较高的任务时尤其有价值。举个例子,Airbnb应用程序在首次启动时显示一个Lottie动画。我们在这里做了一个实验,发现切换到新的渲染引擎可以减少我们应用的总启动时间,同时也可以改善启动动画的帧率和用户体验。
今年早些时候,我们在Lottie 3.4.0中首次引入了核心动画渲染引擎,在一个选择功能标志后面。我们在Airbnb应用的所有Lottie动画中默认使用新引擎已经超过六个月,并且一直在努力修复社区中早期用户报告的问题。
从今天发布的iOS版Lottie 4.0开始,所有使用Lottie的应用都默认**启用核心动画渲染引擎,应用开发者无需额外工作或迁移。这是我们努力了很久的一个重要里程碑,我们希望它能帮助提高整个行业的动画质量和性能标准。
iOS版Lottie 4.0还包括由社区成员贡献的几项重大改进。
- 支持dotLottie动画文件,其大小比标准JSON文件小得多。
- 一个新的动画解码实现,比之前基于 Codable 的实现快2倍。
你可以在我们以前发表的文章中了解更多关于Lottie的信息,以及我们对开源的承诺。
- 介绍Lottie。我们新的开源动画工具的幕后故事
- 将Lottie迅速推向未来。一个关于Airbnb如何用新语言重写流行的开源库Lottie的个人故事
对在Airbnb工作感兴趣?请查看这些公开的职位。
非常感谢Eric Horacek首次提出这个项目,并在过去一年中审查了100多个拉动请求。还要感谢Lottie的原作者Brandon Withrow,以及多年来提供帮助的许多其他贡献者。
所有产品名称、标识和品牌都是其各自所有者的财产。本网站中使用的所有公司、产品和服务名称仅用于识别目的。使用这些名称、标识和品牌并不意味着认可。