动画特效可以辅助视觉制作焦点,引导注意力的方向,越来越为广大视觉设计师青睐,并广泛应用于各类场景开发。
关于动画设计工具,既有Framer.js、Origami,也有交互原型类Principle、Flinto,还有Figma自带动画演示功能的工具,但是对于一些视觉特效、非逻辑表达类动画,设计师通常会借助AE完成。
遗憾的是,AE动画效果的开发至今也没有一种完备且成熟的跨平台解决方案,导致动画需求交付上线的效率和质量都不尽人意。对于市面上不同的动画开发工具,本文将对比分析不同方案的差异和优劣,辨析其还原程度和性能表现,希望给研发同学们一些参考和借鉴。
一、传统AE设计难点及解决方案
传统的AE设计,总结下来有以下三个核心痛点:
·研发成本高:每个动效都需要研发通过代码来还原,单独排期的特效以及手工配置还原的过程,包括后续复用及改动都需要大量的研发人力持续投入。
·生产周期长:设计师和研发人员需要反复确认效果还原度。这样很难跟上运营节奏,容易错过时事热点。
·视觉动效弱:AE里有很多复杂动效,使用纯代码还原起来非常困难,设计师只能不断简化效果以达到跟开发成本的平衡。
PAG(PortableAnimatedGraphics)是解决这几个痛点的解决方案之一。它是一套完整的动画工作流,诞生之初就是为了降低或消除动画相关的研发成本,打通设计师创作到素材交付上线的极速流程,不断输出运行时可编辑的高质量动画内容。
PAG提供从AE导出插件,到桌面预览工具,再到iOS和Android端的渲染SDK。在AE设计师设计完成后可以直接输出动画文件,SDK研发不需要再参与代码还原,只需要接入一次SDK即可做到素材自助上线。也避免了反复进行效果确认的联调时间成本。
在PAG诞生之前,大家是用lottie来处理这些问题的,不可否认lottie是个很好的方案,但仍有些问题没有得到很好的解决。
二、LottievsPAG
Lottie最早是为了解决矢量图形类动画的问题。从官方社区来看,我们容易发现Lottie的矢量基因,社区作品大多是图形类动画。
Lottie库和插件是Airbnb于年前后发布的一款跨平台的动画解决方案,设计师通过bodymovin从AE中将动画导出json文件,开发只需将其导入资源文件夹直接引用即可。
Lottie早期的版本不支持图片类动画,导出json之后会自动生成一个img的资源文件夹,播放.json文件时,需要解压资源压缩包到本地目录才能正常播放。从bodymovinV5.1.15之后,Lottie将图片转为base64编码,使用字符代替图像地址,并封装在json里,直接播放一个.json文件,不用再拖着一个资源文件夹了。
Lottie当前对图片类动画的支持依然会有一些小问题,有时候需要仔细排查出问题的图层,并对照官方文档灵活调整动画替代方案。
PAG最初诞生的原因,正是因为Lottie无法满足视频编辑场景里的动画以下几点需求:
1.当时它根本不支持文本图层,可编辑的字幕贴纸是视频编辑非常重要的能力。
2.在iOS上它依赖CALayer渲染,当用在非主线程的视频合成时,有部分动画会不呈现。
3.Android上,它的遮罩实现无与伦比的卡(10×),但受限于Java层的阉割版Canvas,也没有特别好的实现方式。
当时的Lottie还存在大大小小扎堆的渲染Bug以及功能支持还不完善,如无法反向遮罩,矢量图无法挖空等等。
PAG选择了放弃重写渲染SDK解决方案,从头开始设计一种更高效的二进制动画文件格式,并基于AEC++SDK重新实现了导出插件,又基于跨平台C++和OpenGL重写了两移动端渲染SDK,历时半年跑通第一个版本。PAG包含了当时Lottie支持的所有功能,并彻底摆脱了导出和渲染上的能力扩展相关限制。
相比于Lottie方案,PAG不仅解决了在它在矢量动画渲染上的各种问题,更重要的是扩展了动画的使用场景,PAG围绕运行时可编辑性设计了灵活的架构,能够完美实现动画的局部编辑替换需求。
三、PAG主要优势介绍
PAG在运行时,可在保留动画效果前提下,动态修改替换局部的文本或占位图内容,甚至对任意子图层进行增删改及移动,极大丰富了动画素材的使用场景,轻松实现照片和视频模板等素材的批量化生产。
PAGSDK整套方案是基于C++和OpenGL的跨平台架构研发的,不依赖平台相关的UI框架,除了能做到跨端渲染完全一致外,还能轻松移植到各个原生平台,其中也包含服务器端的渲染能力。
在性能方面,PAG应用了游戏渲染里的大量的优化经验,设计了从中间渲染数据到局部位图的多级缓存架构,加上帧预测的技术,每帧渲染耗时平均可以做到Lottie的50%左右。
由于采用二进制格式,不存在JSON的字符串解析,解码耗时平均比Lottie文件的快12倍,相同的动画内容导出文件只有Lottie一半左右大小,同时二进制文件格式也更容易做到单文件集成图片,音频,视频等任意资源。
(数值单位:毫秒)
以下总结了PAG方案的六大优势:
1、文件更小
PAG是二进制文件格式,并采用了可变长编码整形以及动态按位聚合这些压缩技术,让相同动画导出的文件大小平均只有Lottie的一半左右(都经过zip压缩后对比)。PAG除了对特效类动画的支持可圈可点,对矢量动画的支持也是非常优秀,甚至强于Lottie。以一个生长动画为例,Lottie文件14k,而PAG文件只有1k。
2、解码更快
由于采用二进制格式,不存在JSON的字符串解析,解码耗时平均只有Lottie文件的7.6%,同时二进制文件格式也更容易做到单文件集成图片,音频,视频等任意资源。
3、支持更多AE特性
PAG目前支持Lottie在移动端几乎所有的功能,并且额外在文本,遮罩,滤镜方面比Lottie支持更加全面。除了矢量导出,PAG还增加了视频序列帧导出,能够支持所有的AE特性。
4、性能更好
基于C++和OpenGL硬件加速渲染,除了能做到两端渲染完全一致外,应用了游戏渲染里的大量的优化经验,从中间渲染数据到局部位图的多级缓存架构,每帧渲染耗时平均可以做到Lottie的50%左右。
5、编辑性更高
除了运行时文本编辑和占位图替换功能外,PAG还支持图层级别的任意组合修改。为复杂的应用场景提供更加灵活的编程扩展能力。
6、支持服务端渲染
PAG支持服务端渲染能力,以C++方式接入,可以支持服务端照片转特效视频以及一键大片模板等功能,结合H5快速实现运营活动页。
四、PAGSDK端全平台接入方式
目前PAGSDK已经支持了5个原生平台,包含iOS、Android、Linux、Windows和macOS等。而且SDK的接入非常便捷,可实现10分钟快速接入。
Android端SDK为aar文件,支持armeabi,armv7a,arm64
iOS端SDK为framework文件,分为四个版本:真机版(arm64、arm64/armv7)和真机模拟器版(arm64/x64、arm64/armv7/x64)
·Android端接入
基本要求
·支持android4.4及以上系统
·推荐使用gralde3.0及以上版本编译
aar接入
1.将libpag的aar文件放置在android工程项目的libs目录下
2.添加添加aar库依赖
在app的gradle文件app/build.gradle,添加libpag的库依赖
注意:需要在混淆列表里面,添加libpag的keep规则:
配置完以后,sync一下,再编译。
maven接入
i.在root工程目录下面修改build.gradle文件,增加jcenter的maven仓库
ii.在app的gradle文件app/build.gradle,添加libpag的库依赖
注意:需要在混淆列表里面,添加libpag的keep规则:
配置完以后,sync一下,再编译。
·iOS端接入
基本要求
·支持iOS8及以上
·需要使用Xcode8.0及以上版本进行编译
Framework接入
1.将libpag的framework文件放置在iOS工程项目目录下
2.在项目工程中,配置所使用Target的General-EmbeddedBinaries,添加libpag.framework
3.由于libpag暂时不支持Bitcode,需要配置BuildSettings-BuildOptions-EnableBitcode为No
cocoapods接入
修改App目录下的Podfile文件,添加相应的libpag的引用.
DEMO及测试素材可通过