送礼物作为观众打赏帮衬主播的一种办法, 也是直播应用的一大收入来源,
每种直播平台都带有送礼这一效果, 并且都把礼品动画效果做的尤其炫酷.
如此的卡通效果再搭配美人或帅哥主播的一句”感谢某某某送的大飞机~”,
是或不是思想都有点小感动, 感觉须臾间变成了半场的纽带?

由于要在类型中优化送礼物内部存储器暴涨的题目,所以在网上找了不可胜道素材。最后找到四个小伙伴的,十一分不利,解决了自我的题材。
借鉴那篇作品:

本文来源于Dev Club
开发者社区,非经我同意,请勿转发,原作地址:

正文首要讲述的正是大红包动作效果的兑现. 全文共两千字左右,
差不离阅读时间为5~12分钟.

【www.88850.com】腾讯优测干货分享,关键帧动画内存优化。UIImageView自带的animationImages来做种类帧播放会出现内部存款和储蓄器激增的情形.

选用多张图片做帧动画的品质优化

【www.88850.com】腾讯优测干货分享,关键帧动画内存优化。先放上按体系帧播放方案实现的卡通片引擎FXAnimationEngine,
德姆o中达成了直播间礼物队列、礼物配置、礼物列表,
其余还分别用动画引擎与原生Core Animation去播放体系帧动画以做比较.

1.加载图纸的情势优化
【www.88850.com】腾讯优测干货分享,关键帧动画内存优化。imageNamed方法创制对象的步子如下:

背景

QQ群的送礼物作用供给加载几十张图然后做帧动画,但是多张图纸加载造成了相当大的品质耗费,导致图片起先加载到实在播放动画的岁月距离相比较长。所以须求研讨一些优化方案进步加载图片和帧动画的属性。

然后国际惯例, 上两张图

依据图片文件名在缓存池中寻找图片数据,如存在,则创立对象并赶回;
借使不存在,则从bundle中加载图片数据,成立对象并回到;
假定相应的图形数据不存在,再次回到nil。

规律分析

iOS系统从磁盘加载一张图纸,使用UIImageView显示到显示屏上,供给通过以下步骤:

  1. 从磁盘拷贝图片数据到基础缓冲区。
  2. 从水源缓冲区复制数据到用户空间。
  3. 生成UIImageView,把图像数据赋值给UIImageView。
  4. 假定图像数据为未解码的PNG/JPG,解码为位图数据。
  5. CATransaction捕获到UIImageView
    layer树的浮动,主线程Runloop提交CATransaction,初步举行图像渲染。假若数量没有字节对齐,Core
    Animation会再拷贝一份数据,进行字节对齐。GPU处理位图数据,进行渲染。

梦幻城堡

不缓存:imageWithContentsOfFile:
不可能不传入图片文件的人名(全路线+文件名)。
没辙加载Images.xcassets中的图片。

加载图片

加载图片和图纸解码是比较便于影响属性的有的成分。iOS设备上的闪存就算是非常快的,然则仍旧要比内部存款和储蓄器慢接近200倍左右。图片加载的属性取决于CPU和IO,所以适当的收缩IO次数能够升官部分属性。

普通状态下,应用应该在用户不会发现的时候加载图片,能够针对景况接纳预加载图片可能延缓加载。假诺是帧动画那种景观,图片很难做延迟加载,因为帧动画的光阴相比短,延迟加载很难保障播放每一帧时能提前加载到图片。有个别比如列表滑动之类的处境延迟加载就会相比合理,并且能够运用子线程异步之类的不二法门制止滑动卡顿。

天使

大图片最好利用imageWithContentsOfFile,内部存款和储蓄器会释放。

解码

图片加载截至之后在被渲染到显示屏此前,固然是未解码的JPEG可能PNG格式,图片会先被解码为位图数据。经超过实际际的测试,图片解码平常要比图片加载费用越来越多的光阴。iOS默许会在主线程对图像进行解码。很多库都消除了图像解码的标题,然而由于解码后的图像太大,一般不会缓存到磁盘,SDWebImage的做法是把解码操作从主线程移到子线程,让耗时的解码操作不占用主线程的岁月。


那就是说有何点子可避防止吗? 可不可以每趟播放到哪一帧时就去加载那一帧的图纸,
即每便仅加载一张图片到内存中. 那样当播放到下一张图纸时,
上一张图片已无别的引用, 系统本来会对其展开释放.

解码与加载图片耗费时间相比

测试机型:One plus 6+

—- 只加载不解码平均时长 加载和解码平均时长
同一张图加载三十次 0.000858531 0.005955906
加载三十张不同的图 0.002828871 0.015458194

解码的年华一般是加载图像数据时间的三到四倍左右。

① 、直播应用礼物动画的大规模方案

仅个人驾驭, 完结iOS侧动画配置化常见方案有如下二种:

iOS方案 优点 缺点
Core Animation(此处不计CAKeyFrameAnimation) 效果流畅逼真 安卓需重新实现; 配置化成本高, 需自定义模型、协议、转换方法等(iOS侧已有现成工具, 某几家直播公司想必也有自己的动画配置化工具); 不解决动态配置问题, 则只能随包更新.
序列帧播放(CAKeyframeAnimation、CADisplaylink、ImageView等) 设计哥工具可直接导出动画序列帧图片, 简单易用; 多平台兼容 效果略差; 图片帧数多易导致资源大
Cocos2d-x 效果好; 多平台兼容 学习成本; 相应动画制作工具; 必须引入Cocos2d库;
Lottie 横跨三端, iOS, Android, React Native. 设计师可以完全按照自己的想法设计. 无需考虑实现这一块. 内存占用? 作者本人尚未使用过, 不敢妄自评论

可以看来, 连串帧播放方案是当中最简易易行的二个. 以作者之见,
花椒直播用的便是那套方案, 他们每三个动画片,
都会相应一个安顿文件config.ini及对应当动画的持有类别帧图片.

感兴趣的情人能够移至最终一部分礼物资源的下载策略、资源目录结构等有关内容,
更提议尝试去追究一下花椒、映客等主流直播应用的bundle目录以及document中的财富.

那便是最简单易行有效的一套方案.
可是大家鞭长莫及靠CAAnimation及其派生类CAKeyframeAnimation来实现这一方案,
因为具备的图样都会解码导致占用大批量的内部存款和储蓄器.

各样加载图片API的解码的时机

UIKit:

 +imageNamed://加载到原图后立刻进行解码
 +imageWithContentsOfFile://图像渲染前进行解码

UIImageView的image被赋值时会立时实行解码。

图像用UIKit内的绘图API绘制时会即刻进行解码,那么些API的好处是足以在子线程进行。

ImageIO:

 NSURL *imageURL = [NSURL fileURLWithPath:str];
 NSDictionary *options = @{(__bridge id)kCGImageSourceShouldCache: @YES, (__bridge id)kCGImageSourceShouldCacheImmediately: @NO};
 CGImageSourceRef source = CGImageSourceCreateWithURL((__bridge CFURLRef)imageURL, NULL);
 CGImageRef imageRef = CGImageSourceCreateImageAtIndex(source, 0,(__bridge CFDictionaryRef)options);
 UIImage *image = [UIImage imageWithCGImage:imageRef];
 CGImageRelease(imageRef);
 CFRelease(source);

kCGImageSourceShouldCacheImmediately 决定是或不是会在加载完后旋即初阶解码。

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图