本文字数:6628字
预计阅读时间:39分钟
01
项目背景介绍
项目中直播流每场直播由一张直播图片作为展示入口,用于提示用户此直播的概要。如下图:
然而直播图片和容器的宽高比例出现不一致的情况。针对此情况,采取背景图 contentmode
展示为 aspectFill
且高斯模糊,上层高清图为 aspectfit
,给用户一种图片填满且能清除获取信息的视觉体验。如下图:
然而服务端下发直播的图片分辨率在1000 * 2000byte左右,占用内存大小为1000 * 2000 * 4,约为 2M 大小。资深直播用户最多有一千场直播。使用 sd_webImage
下载图片并缓存在内存中,查看足够多的直播封面时,在iPhone 13机型,iOS15的手机,滑动到400场直播时,就会产生内存不足崩溃。且崩溃堆栈展示在进行高斯模糊的方法中。
02
分析问题
经过初步分析,得出影响内存的原因有以下几方面。
图片分辨率高,高斯模糊占用的内存越高。因为需要对进行大量模糊计算;
用户快速滑动直播流,正常的下载图片速度会展示所有划过的图片,高斯模糊在图片下载完成
block
中执行,即使划过的直播图,也会继续高斯模糊直至返回。这样会导致用户大量无意义图片占用大量内存;两张
ImageView
需要在内存中加载两张一样的图片,是一种内存浪费;为了用户查看图片的及时性和流畅性,项目中没有设置存储高斯模糊图片最大占用内存。这会导致图片内存只会在内存警告时被清除。导致高斯模糊不能获取足够的内存而崩溃;
高斯模糊采用
vImage
方案,占用 CPU 进行高斯模糊计算,CP