直播APP的性能优化-礼物篇

介绍

记录、总结开发遇到一些问题,大家一起交流学习。
这次带来,对直播APP性能优化的总结,以QA的形式总结。

欢迎关注文集-直播Live

实现方式

1、Q:礼物动画如何实现?

A:礼物分小礼物动画和豪华礼物处理;
序列帧+GCD+layer动画+UIView的Block动画组合使用;

2、Q:定时器采用CADisplayLink还是NSTimer?

A:都可以。重点在于添加到的mode,个人采用的是添加到NSRunLoopCommonModes的CADisplayLink。

3、Q:CADisplayLink对应的屏幕刷新和Xcode的FPS是什么关系?

A:CADisplayLink对应的是屏幕刷新帧率,一般60FPS;
xcode的FPS是真实显示的帧率,只要一帧处理的时间超过16ms,显示帧率就不会为60FPS;

4、Q:小礼物的连击效果如何实现?

A:逻辑上,礼物连击可以看成多个桶排成的队列,礼物赠送者id+礼物类型相同的放在一个桶内。连击过程中,可以不断往桶里放礼物。如果连击完成,桶里没有礼物,开始放下一个桶的礼物。
实现上,给礼物数字放大缩小动画设置delegate,在stop回调的时候进行上述的逻辑判断即可。

5、Q:小礼物的连击数字是[0-9]的文字图片组成的,每次显示都需要拼接图片,如何优化?

A:用富文本的格式,同时图片用imageNamed的形式加载;如果内存不紧张,可以把富文本根据num缓存,避免多次拼接;

    NSMutableAttributedString * mutableAttributedString = [[NSMutableAttributedString alloc] initWithString:sendGiftNumStr];
    UIImage *giftNumIcon = [UIImage imageNamed:imageName];
    NSTextAttachment *giftXAttachment = [[NSTextAttachment alloc] init];
    giftXAttachment.image = giftNumIcon;
    NSAttributedString *giftXAttributedString = [NSAttributedString attributedStringWithAttachment:giftXAttachment];
    [mutableAttributedString replaceCharactersInRange:NSMakeRange(0, 1) withAttributedString:giftXAttributedString];

图片加载

1、Q:加载图片iPhone4+iOS7,加载图片,提示:

Could not load the "gift_plane" image referenced from a nib in the bundle with identifier
Unable to create unsliced image from csi bitmap data
Unsupported pixel format in CSI

A:把Images.xcassets里面的jpg相关的图片换成png。
The issue is that iOS 7 apps cannot have JPEG images in the CAR file. actool should have copied the JPEG as a loose image into your app's folder. To work around this issue, you should either convert the image to a PNG or include the JPEG as a resource outside of the asset catalog.

2、Q:直接以引用方式导入的图片,pathForRes查找图片的路径?

A:方式1
[UIImage imageNamed:imagePath]imagePath为图片的相对路径;
方式2:

imagePath = [[[NSBundle mainBundle] bundlePath] stringByAppendingString:imageName];
[UIImage imageWithContentsOfFile:imagePath];

imagePath为图片的相对路径,而且必须附带.png的后缀;

3、Q:imageWithContentsOfFile加载的图片没有缓存,重复使用的时候会加载多次,是否可以用NSMutableArray存储起来?

A:不行。可以使用NSCache,步骤如下:

1、加载cache中的图片; 如果有则返回,没有到步骤2;
2、加载本地的缓存文件,如果有则返回,没有到步骤3;
3、从网络下载图片,到步骤4;
4、存入本地的缓存文件,到步骤5;
5、放入cache,返回图片;

如果不需要网络下载图片,可以去除3、4步骤,同时可以同步返回;

如果使用array存储图片,会一直持有引用;NSCache会在内存不足时主动释放,故而加载的时候需先判断是否有缓存文件;

4、Q:使用序列帧的时候,需要加载很多次图片?

A:可以把多张图片放到一张图片,加载后通过-CGImageCreateWithImageInRect切割出多张图片;

内存优化

1、Q:直播的时候送出一个豪华礼物,为何内存会增加20M?

A:一个豪华礼物占用的内存包括图片内存+Animation(动画)内存;

2、Q:美术给出的资源总共加起来才几百k的大小,为何加载到内存会增加这么多?

A:先查看加载方式,+imageNamed:的方式会添加缓存,但使用完不释放;+imageWithContentsOfFile:的方式不会添加缓存,重复使用会占用多次内存,但使用完会回收;
其次,通过instruments工具查看,imageio_png_data占用内存过多;查看ipa包的图片资源,发现有三张图片分别为(3910528 + 1761437 + 9104388),大小占用450k;简单计算下,(3910528 + 1761437 + 9104388) * 4 = 25M,确定为三张图片过大;

3、Q:如何计算出来的图片大小?

A:图片的颜色空间为RGBA,那么加载到内存的大小=widthheight4bytes;

性能检测工具

1、Q:instruments录制按钮显示unable to find a service to record with

A:检查xcode版本能支持的最大手机版本,没问题的话重启手机和xcode,重新连接。

2、Q:instruments的Anonymous VM(匿名虚拟内存)是什么?

A:匿名虚拟内存是系统为程序预留的、可能会立即被重复使用的一部分可用内存。

3、Q:instruments检查发现除了礼物送频繁后,聊天的UITableView消耗的时间也很长,如何优化?

A:从cell高度计算、图片加载、布局layout开始优化;
a.cell高度不会变,可以缓存;
b.图片加载可以用imageNamed或者cache实现;
c.尽量避免使用autolayout;
d.控制每帧刷新数量;
e.删除过多的历史消息;

总结

优化通过压力测试+instruments工具检测出瓶颈,同时检测代码逻辑实现。这些QA都是优化过程中的一些问题和解决方案,如果有建议和疑问欢迎交流。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,015评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,262评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,727评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,986评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,363评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,610评论 1 219
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,871评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,582评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,297评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,551评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,053评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,385评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,035评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,079评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,841评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,648评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,550评论 2 270

推荐阅读更多精彩内容