【论坛精选问答4】全新 PAGImageView,企业版 SDK,整体透明度,SDK 包体大小 #4
FusionXu
announced in
Announcements
Replies: 0 comments
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
PAG SDK
1、【问题】PAGImageView 与 PAGView 相比有什么优缺点,是否可以把所有的 PAGView 都替换成 PAGImageView ?
【解答】PAGImageView 的实现原理是将每帧渲染的内容通过 LZ4 压缩缓存到本地磁盘,如果 PAGImageView 渲染的尺寸较大且 pag 文件时长较长,如手机全屏这种情况,会占用较大的磁盘空间做缓存,可能一个 pag 文件缓存下来就要几百 MB,目前磁盘缓存默认占用最大磁盘空间为 1GB,如果这样的情况较多,会不断触发清理缓存逻辑,不但不会提升性能,反而使性能变差。
PAGImageView 适用于 UI 列表 或一个页面中含有多个小尺寸 View 的场景,这种场景下渲染的尺寸较小,一个 pag 文件缓存完占用的磁盘空间也就几十 MB,渲染使用的时候会不断命中缓存,从而提升性能。其余场景我们还是推荐使用 PAGView。
另外,对于一些类似 WebP、APNG 等图片序列使用的场景,由于文件尺寸和图片序列的帧数一般不会太大, 图片序列的内容一般全部缓存至内存,渲染的过程中直接读取内存缓存,基本上不占用 CPU。PAGImageView 提供了全内存缓存模式兼顾该场景,此时模式下内存占用较大,CPU 占用较小。
2、【问题】使用 PAGImageView 播放动画时,能否多个动画共享同一个view播放?如果一个界面需要随机地显示多个动画的话,用多个 view 来显示动画,会不会产生性能问题?
【解答】PAGImageView 跟 PAGView 的原理不一样,没有 OpenGL 环境,非常的轻量,整体上是没有必要共享 View 的。要保障画面切换的流畅,多个View是最佳的方案。复用一个 PAGImageView,开销跟重新创建一个是基本一样的,因为开销主要在切换数据源上。
3、【问题】PAG 现在的免费功能后续会不会强制收费,是否会进行把已上线强制要求下架等操作?
【解答】已有的免费能力都不会转收费,未来也会持续完善社区版,不断地增加新功能特性。未来探索的收费方向主要会聚焦在比较垂直的特殊使用场景下,或新增的开发难度非常大的模块,以及高阶的技术支持服务需求这块,基础通用的功能会保持免费。
比如这次 PAG 企业版,其实就是把之前针对音视频垂直场景下售卖的视频编辑框架TAVMedia方案做了简化,跟视频模板相关的所有能力提取整合到了 PAG 里,避免业务侧需要购买全功能的TAVMedia实现视频模板,有点杀鸡用牛刀,除了性价比不高,上手也有门槛。跟 PAG 整合后整体的使用门槛更低,让视频模板一类的业务可以几乎没有成本的快速实现。
4、【问题】使用了libpag-enterprise的SDK,动画上面显示“正在使用未授权的企业版SDK...”
【解答】libpag-enterprise 是在 PAG 社区版的基础上增加了一些付费的增值功能,比如一键替换视频,导出视频,素材加密等能力。企业版是需要购买证书授权才可以去掉水印的,目前放出来的版本是供用户正常测试功能使用。如果没有这块的增值功能需求,直接使用 PAG 社区版就行。
5、【问题】火狐浏览器访问时解析报错,其他浏览器都正常
【解答】因为火狐浏览器 B-Frame H264编码 MP4 的兼容问题,并无法正常播放 BMP 预合成的 PAG 动效。如果需要在火狐浏览器上使用,可以让设计师修改素材避免使用 BMP预合成,或者单独为火狐浏览器上的 PAG 添加 ffavc 软件解码器,需要注意 ffavc 是软件解码,性能会比正常情况下差比较多。
6、【问题】准备从 Lottie 迁移到 PAG,但发现透明后重叠了,请问有办法实现整体透明度吗?
【解答】这里是设计如此,因为如果默认按照可以整体调整透明度的方式渲染,会导致要离屏很多次,会有比较严重的性能问题。大部分的渲染框架都是这样分散处理透明度的,比如之前的Flash。并且按这个设定目前跑了近5年也很少有用户反馈相关问题,说明实际场景里遇到的必须要这么用的情况应该很少很少,我们可以先记录一下, 如果后续还有用户反馈类似问题,可以进行渲染方式的调整,也研究一下有没兼顾性能的方式。但总体上即时兼容,这样绘制的性能确实是不如分散应用透明度的。短期建议可以修改制作方式绕过去,几种途径:1.在 AE 里就把透明度分散设置给每个图层。 2.看看能否把需要一起调整透明度图形直接转成一张位图合并到一起,也是可以的。3.如果里面每个元素都是各自有不同的动画,没法直接合并到一个静态图上。最差的情况,你也可以创建一个预合成,把要整体调整透明度的素材整体放这个预合成,并把它标记为BMP预合成,再在上层引用这个预合成就可以整体改透明度了。相当于导出了一份视频格式的序列帧。
如何导出带BMP预合成的PAG请参考这里:https://pag.art/docs/pag-export.html 特别注意一下第三点要导出的实际上是个混合的PAG,外部有个矢量的Composition包含你的BMP预合成,要在外层那个矢量的Composition里改透明度才有效。
7、【问题】那么 Lottie 是如何实现整体透明度的情况下还能保持性能的呢?主要是想把动画用在 UI 图标动画上。
【解答】渲染的原理不一样,Lottie 是依赖各个平台原生的UI框架渲染的,每个平台的性能和能实现的功能都会很不一样。例如你在 Android 上测试 Lottie 就会跟iOS端性能有显著差异。PAG 是依赖跨平台的C++和OpenGL渲染的。每个平台的基准和实现的功能都是一致的。因为基于的底层渲染方案不一样,显著影响性能的点也会不一样,有些在我们这里很简单可以优化的事情,在Lottie里很难做到,反过来也是。主要是用在UI场景的话,可以升级到 PAG 4.2 版本。之前还存在 OpenGL 在UI场景下的系统性劣势,OpenGL 本身是足够快的,但是要和系统的UI框架混合在一起有额外的桥接成本。现在 4.2 版本直接提供了针对UI场景的全新PAGImageView播放组件播放,在UI场景播放的整体内存和CPU占用相比之前的PAGView会有大幅降低,整体也会明显优于 Lottie 的各个平台。
8、【问题】Lottie 的 SDK 包体很小,而 PAG 的 SDK 包体有几 M,是否有优化的方法和空间?
【解答】Lottie使用的是各个平台原生绘图库,每个平台都需要根据不同的绘图库实现一遍相同的功能,在不同平台上表现可能存在差异;而PAG在不同平台上运行的都是同一份绘制代码,保证了每个平台上效果绝对统一,但更多的绘制代码也会引起包体增大。
摆脱原生绘图库,自己实现绘制流程,可以更灵活地添加新能力新效果,这样拓展性无疑会高很多,长远来看这应该也是比较好的选择。
另外,包体大小的问题我们也一直在关注,目前安卓x64单架构压缩后是1000KB左右,应该还是在可接受的范围内。可以看下实际打包后,apk的增量是多少。
Beta Was this translation helpful? Give feedback.
All reactions