很久以前就像怎理一下这个问题,一直被其他事(CF)给耽误了。
现象与问题:加载高清图时,Memory飙升!!!
不管是使用第三方还是用系统API。都会出现这个问题。
一:先说本地加载
当我们使用 系统API 加载本地高清图(2M以上我就认为是高清图了,我的测试图片是在10M左右)时出现内存飙升
cell.ImgView.image = [UIImage imageNamed:@"image00.png"];
NSString *path = [[NSBundle mainBundle] pathForResource:@"image03.png" ofType:nil];
cell.ImgView.image = [UIImage imageWithContentsOfFile:path];
是的。你还是没有看错,400多兆了。一样的图片,使用 imageWithContentsOfFile 内存更加恐怖了,但是退出这个控制器了。内存下去了。变成原来的20M左右了。
所以 imageWithContentsOfFile和 imageNamed 的使用场景要看你自己怎么去衡量了。
但是这是为什么呢?暂时我来科普一下GPU吧
熟悉OpenGL的同学知道,GPU内次渲染图形的时候分为 片段着色器(FrameShade)和顶点着色器(Vertex Shade)。在处理纹理过程中。会给每个Vertex(可以理解为像素)分配内存,让GPU去渲染。所以说在处理 高清图,离屏渲染 的时候,会让内存飙升
二:用SDWebImage 加载网络高清图时
本来在 SDWebImage 4.0.0以前。具体是哪个版本忘记了。反正是17年上旬。那时候的SDWebImage 加载网络高清图时。也会出现内存飙升的情况。但是在17年10月份(具体版本没注意,所以只能以时间来区分了)以后。SDWebImage 的作者 rs。更新了或者是修复了这个问题。
3张都是网络高清图
内存情况只有再全部加载出来时,由默认图片替换高清图时。GPU在内存中渲染像素让内存飙升一下。也就一秒钟。看了rs 也认识到这个问题并修复了。(下班。明天再补,哈哈)