本文字数: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 带来额外的工作。