本周被教导的很彻底,膜拜大牛0.0 主要target直播,不感兴趣的可以避雷~
1. 限制刷新频率
这个库是用于限流哒,可以多次调用仅保持最后一次:
https://github.com/yulingtianxia/MessageThrottle (MTModePerformLast模式)
上面的使用场景例如直播间主播收到礼物的总值 or 人数,每次用户送礼都会刷新,如果用户送礼多那么就会频繁刷新,但其实对于用户而言,1秒刷新100次和1秒1次没啥区别,所以应该限制一下每秒仅刷新一次,只要最后一次的数值即可。这个其实适用于很多UI刷新场景,也和之前问过的button如何避免多次点击很类似。
例如直播间里面的聊天,经常是收到后端的消息就append一下然后刷新table,但是这个就非常头疼,如果要是消息很频繁,那么reload的频率是很高的,所以可以设置timer,每秒刷新一次。因为聊天消息不能只取最后一次,所以不能用上面的限流方式而用timer。
2. 队列上限
我们的礼物以及消息队列可能会有很多,尤其是礼物队列,因为礼物要一个一个展示,所以会排个队(注意这里还是应该有高级礼物优先展示的哦),如果队列东西很多,那么其实很多到最后没有时间展示,毕竟你如果送个礼物,队列里面有2000个每个1秒那也得半小时以后看到,其实送礼的人是没有感知的,所以应该设置一个队列容纳的上限,如果达到了上限最早最旧的先被丢弃,毕竟放入那么久了没有意义了就。
3. 进入直播关闭GPS、清空image缓存等
其实进入直播以后,大多主播的位置是不会变的,但长期直播对系统消耗挺大的,最好能关掉所有不必要的东西,例如GPS,最好再主播开播之前记录一下地理位置以后,进入就关掉GPS,否则它会一直在后台获取非常耗电。同理的还有陀螺仪。
另外就是把SDWebImage缓存置小一点,腾出一些内存,不同机型最好不一样。进直播以后就把已经缓存的清掉,只清理内存,磁盘缓存不用的,所以木有影响。然后改一下配置,退出直播以后再还原缓存上限。
有一个小tip,就是可以通过XCode的仪表盘,点击energy电量消耗,可以看是不是有GPS耗电占比,如果有则代表开启了GPS并且耗电量大应该关掉。
4. 主播直播帧率采集 and 大型活动保障
这个其实就是应该由后端下发采集码率分辨率之类的,因为分辨率和帧率对性能影响最大了,码率之类的还其实还好。
在大型活动之前,如果知道今天晚上很大可能直播们会收到很多礼物,应该找到那些低端机型的主播,提前和他们说好将他们的帧率降低,保证直播的稳定性。
还有一些反正就是不影响他们直播体验的能关就关,比如礼物特效、手势之类的,反正直播端关掉观众还是可以看到礼物特效的。
这些其实就是由后端下发很多开关,最好是可以及时生效,如果不可以至少提前一天下发给主播们,关闭没用的~
这里注意主播和观众不一样的哈,对于观众而言,码率帧率并不是导致他们卡顿的原因。
5. 礼物object用数量字段替代创建新对象(礼物聚合)
观众端如果收到了很多相同的礼物消息,就会创建很多个礼物对象,但是有的时候其实是重复的礼物,例如10个火箭。每个对象创建都是有消耗的,占内存很大,如果可以用创建一个火箭对象标记一个数量10来替代创建10个对象会好很多。
6. 礼物资源限制
贴脸礼物之类的分辨率最好不要太大,最好限制一下(手写、svga、视频礼物),需要引入资源上传和校验平台。毕竟礼物加载是占内存的啊。
7. 建立性能测试流程
主要是内存、CPU、GPU
例如需要看进出直播间的内存能不能恢复到初始位置,CPU以及GPU多少。内存和CPU可以用instrument看~
主播端内存不出问题是很重要的,毕竟如果有问题直播2个小时就崩了,而且媒体层很容易有问题。
每次发版前需要将,从大型活动录制脚本(2000条聊天记录 + 2000礼物),在发版前跑一次看CPU之类的。以及发版前最好看一下这个版本各个指标的问题,例如卡顿之类的。
更新三方SDK可能会影响编码异常,新增大功能可能内存会涨的很明显。这些都需要测试以及单独看接入的影响。
8. 动态修正
卡顿和温度关系比较大。(温度到3就有问题)
视频性能有问题的话就降帧,以及去掉动画(手机卡不卡热不热)。要找出耗CPU和GPU的并且即使没有对主播没有太大影响的东西。就像动画、礼物帧数啥的。
等主播手机温度恢复以后再恢复正常。