关于媒体编辑的内存缓存占用策略优化心得

这是一个可以编辑的媒体的界面 可以多选 编辑分享保存 媒体是从硬件端传过来的
因为图片比较小 所以我做的第一步就是对原图进行压缩成缩略图 只有在当前界面才会显示缩略图 分享保存点击查看都是用的原图
thumbMediaData = UIImageJPEGRepresentation(picture, FILE_ZIP_RATIO);
NSURL *thumbnailUrl = [MRMediaManager getThumnmailMediaFileUrlWithMediaModel:model];
// 将 file:// URL 转换为路径字符串
NSString *filePath = [thumbnailUrl path];
UIImage *thumbnailImage = [UIImage imageWithContentsOfFile:filePath];
// 设置图片,如果图片不存在则显示占位图
if (thumbnailImage) {
videocell.imageView.image = thumbnailImage;
} else {
videocell.imageView.image = [UIImage imageNamed:@"media_image"]; // 或者加载失败的图
}起初我是通过直接加载图片 发现内存比较高 而且上下滑动的时候 很卡 随后我就发现这个加载图片都是在主线程直接加载 搞清楚原因之后 我就开始着手优化这个,
SDWebimage 这个库我们在加载网络图片的时候都会用到 实际上 用它来加载本地图片一样的好用
然后我就又尝试了一版
NSURL *thumbnailUrl = [MRMediaManager getThumnmailMediaFileUrlWithMediaModel:model];
[videocell.imageView sd_setImageWithURL:thumbnailUrl placeholderImage:nil];这样处理之后呢 滑动起来确实是比较流畅了 因为它把加载放在了子线程 但是马上我就发现了 当持续滑动的时候 它的瞬时内存占用 会很大 基本是上面直接加载的图片方式的2倍,虽然说这样可以滑动卡顿的问题 但是瞬时内存大的问题 还是存在,于是于是 我还得继续优化 毕竟现在图片还不多 大概就70多张 已经占用了我接近1G的瞬时内存,后面复用的过程中 实际占用还是会回落 但是还是会比普通的占用要大很多
好了 接下来就是终极解决方案了
CGSize targetSize = CGSizeMake(SCALE_WIDTH(300), SCALE_WIDTH(300));
SDImageResizingTransformer *transformer = [SDImageResizingTransformer transformerWithSize:targetSize scaleMode:SDImageScaleModeAspectFill];
NSURL *thumbnailUrl = [MRMediaManager getThumnmailMediaFileUrlWithMediaModel:model];
[videocell.imageView sd_setImageWithURL:thumbnailUrl placeholderImage:nil options:0 context:@{SDWebImageContextImageTransformer: transformer}];从 SDWebImage 5.10.0 版本开始,官方提供了一个内置的 SDImageResizingTransformer,专门用于在下载和缓存之前调整图片大小。这是最直接、最推荐的方法。
下面来说下这个类的工作原理
工作原理:
1.SDWebImage 在后台线程获取到原始图片数据后,在解码之前,会检查 context 中是否有 SDWebImageContextImageTransformer。
2.如果找到了 transformer,它就会使用这个转换器(在这里是 SDImageResizingTransformer)来处理原始图片。
3.transformer 会生成一个符合 targetSize 的新图片。
4.SDWebImage 会将这个转换后的小图存入内存缓存和磁盘缓存。
5.最终显示在 UIImageView 上的也是这个小图。当然也有更加底层的方案
使用 SDWebImageContextImageThumbnailPixelSize 上下文选项
这个选项会直接传递给 SDWebImage 底层的解码器。解码器在调用 ImageIO 的 CGImageSourceCreateThumbnailAtIndex 函数时,会将 thumbnailPixelSize 作为 kCGImageSourceThumbnailMaxPixelSize 参数的值。这实现了在解码时就生成指定大小的缩略图,效率非常高。
这里我就直接用官方的SDImageResizingTransformer类实现了 最终测试出来 内存占用基本不超过100 确实很让人满意 不过加载的图片因为是从我已经处理的缩略图里面 再次压缩得到的 会相对来说比较模糊 大家可以根据自己能接受的程度 动态调整targetSize的大小,调到一个总体满意的程度即可