直播流⻚⾯内存优化⽅案

直播流⻚⾯内存优化⽅案

本文字数:6628字

预计阅读时间:39分钟

01

项目背景介绍

项目中直播流每场直播由一张直播图片作为展示入口,用于提示用户此直播的概要。如下图:

然而直播图片和容器的宽高比例出现不一致的情况。针对此情况,采取背景图 contentmode展示为 aspectFill 且高斯模糊,上层高清图为 aspectfit,给用户一种图片填满且能清除获取信息的视觉体验。如下图:

然而服务端下发直播的图片分辨率在1000 * 2000byte左右,占用内存大小为1000 * 2000 * 4,约为 2M 大小。资深直播用户最多有一千场直播。使用 sd_webImage 下载图片并缓存在内存中,查看足够多的直播封面时,在iPhone 13机型,iOS15的手机,滑动到400场直播时,就会产生内存不足崩溃。且崩溃堆栈展示在进行高斯模糊的方法中。

02

分析问题

经过初步分析,得出影响内存的原因有以下几方面。

图片分辨率高,高斯模糊占用的内存越高。因为需要对进行大量模糊计算;

用户快速滑动直播流,正常的下载图片速度会展示所有划过的图片,高斯模糊在图片下载完成 block 中执行,即使划过的直播图,也会继续高斯模糊直至返回。这样会导致用户大量无意义图片占用大量内存;

两张 ImageView 需要在内存中加载两张一样的图片,是一种内存浪费;

为了用户查看图片的及时性和流畅性,项目中没有设置存储高斯模糊图片最大占用内存。这会导致图片内存只会在内存警告时被清除。导致高斯模糊不能获取足够的内存而崩溃;

高斯模糊采用 vImage 方案,占用 CPU 进行高斯模糊计算,CPU 繁忙不能及时释放内存,进一步加剧内存紧张。

03

针对问题,采取措施

降低图片分辨率

通⽤降低分辨率⽅式为采用图片云开发系统提供的服务。在图片 url 中加入分辨率的参数, 直接下载相应分辨率的图⽚。分辨率的设置,以图片清晰为标准,⼀般设置为展 示 ImageView 的大小。这样不消耗客户端的资源,不会给 CPU 带来额外的工作。

相关推荐

苹果怎么拼写
bet3365标准版

苹果怎么拼写

📅 07-30 👀 947
科普帖:关于英雄联盟攻速的计算方
体育平台送365彩金

科普帖:关于英雄联盟攻速的计算方

📅 07-29 👀 4771
用西班牙语说早安的三种语法,你都会了么
体育平台送365彩金

用西班牙语说早安的三种语法,你都会了么

📅 07-11 👀 6615
冰箱断电后还能保存食物多久?揭秘食物保鲜的秘密