图随意 大图随意 iOS开发者,注意内存开销!
2023-12-07 03:59:40
现在 App 的功能越来越多,对图像的处理也就越来越多,但是处理图像无疑是一件比较消耗资源的工作。
最近,我发现 APP 的直播间内存占用峰值非常高。经查,原因是因为聊天列表中,部分用户向列表中放了一张大图。这张图的像素数是一般设备的分辨率的四倍,一张图的内存开销就占用 2000+ KB,放 50 张图就占用 100000+ KB。
很显然,这是一个很严重的内存泄漏问题,只要用户一直放图,我们的内存就一直增加。并且,这张图片并不会随着页面销毁而销毁,而是一直会放在内存中,而我们的内存就永远增加下去,占据了大量手机内存。
当然,我们可以直接在 APP 中进行拦截,拦截大图,或者添加一些压缩处理等,但是这治标不治本。
在 Swift 中,image 的处理与显示是两个分离的,很清晰的两个方法:
//在图片上添加圆角和边框
func makeMaskImage(with image: Maskable, cornerRadius: CGFloat, borderWith: CGFloat, borderColor: UIColor){
//增加圆角
let output = image.applyMask(withRadius: cornerRadius)
//加边框
let borderdImage = image.maskedBorder(with: borderWith, and: borderColor)
return input.alphaMask(with: maskImage)
}
所以,优化内存的时候,一般都从以下三个方面出发:
-
选择合适的大小和精度,不要使用不必要的数量级
-
设计数据结构的时候,也要更仔细的权衡字段的长度和类型,尽量节约使用
-
循环的时候,也是尽量小范围的循环,不要遍历整个表结构,用循环去完成一个没有必要的事情
-
内存优化的时候,尽量使用算法,现在时间是便宜的,空间是贵的,不要为了节省时间而浪费空间
我们都知道,任何设备的内存都是不大的,所以开发者在开发的时候,都尽量减少对手机内存的占用,针对一些需要处理的图像,可以做一些必要的压缩工作,优化处理方式,这样就可以大大减少内存的占用。
针对图像优化,我们可以从以下几个方面进行优化:
-
裁剪图片:因为很多时候,我们图片上其实还有不需要展示的部分,比如说聊天列表中的大图,我们可以裁剪出聊天列表的展示面积的图片,而不是全部图片都展示。
-
处理图片:我们可以使用一些算法来处理图片,比如:
-
使用压缩算法压缩图片的内存
-
降低图片的分辨率
-
修改图片格式
- 合理使用内存:
-
使用一些图片内存管理的 API,让我们的内存只保留部分图片
-
不要使用一些大图作为背景图
总之,做好图片处理,规避一些图片展示上的误区,才能从根本上优化内存,减少对手机内存的占用。