学习Instrucments之Core Animation之 Color Misaligned Images

http://www.liuhaihua.cn/archives/256577.html

今天我们来学习学习Instrucments之Core Animation之 Color Misaligned Images 。

官方说明是这样的: Color Misaligned Images: Places a magenta overlay over images where the source pixels are not aligned to the destination pixels.

意思就是当图片的源像素与目标像素不对齐是会放一个洋红色的层在图片上。当图片的像素大小与控件的大小不一致而导致需要缩放时,图片会呈现黄色。

本篇文章是记录笔者学习优化图片显示的笔记,同时希望能够帮助大家进一步学习,当然更希望大家多思考多评论,将自己的想法都在评论中写出来!

Instrucments Core Animation界面

我们先来说说Instrucments中的选项之一:Core Animation。运行后,默认看到右下角是第一个按钮,勾选上用于设置监测FPS的:

Color Misaligned Images

而我们根本每一选项做优化,要看下图,每次只勾选一个,一步步优化:

Color Misaligned Images

优化前

根据官方说明,图片像素不对齐(也就是图片带alpha通道)时,会在图片上面加一层洋红色来标识;而图片被缩放时,会加一层黄色来标识。那么先看看我们的demo中被优化前的UI:

Color Misaligned Images

笔者通过网上找了一些带alpha通道的png图片,果真被标识为洋红色了。不过奇怪的是,两个一样的图片,为什么显示成正方形的时候,并没有被标识为像素不对齐呢?

笔者尝试修改左上角的头像为长方形,不过并没有用,还是显示为黄色而非洋红色。而且,这设置图片的代码是一样一样的,结果还是没有变化修改成洋红色,这个问题笔者暂时找不到原因。

希望大家知道原因的,可以告知一声,谢谢!

在优化前,我们监测FPS如下:

Color Misaligned Images

右边一列是FPS值的变化,我们是在滚动时的FPS,说明不做优化处理,对于滚动的流畅性影响是比较大的。

在优化前的代码是:

NSString *path = nil; if ([model.headImghasSuffix:@".png"]) {     path = model.headImg; } else {     path = [[NSBundle mainBundle]pathForResource:model.headImgofType:nil]; } UIImage *image = [UIImageimageNamed:path]; self.headImageView.image = image;

对于UICollectionViewCell中显示的图片优化前是这样的:

NSString *imgName = self.model.imgs[indexPath.row]; NSString *path = nil; if ([imgNamehasSuffix:@".png"]) {     path = imgName; } else {     path = [[NSBundle mainBundle]pathForResource:imgNameofType:nil]; } UIImage *image = [UIImageimageNamed:path]; imgView.image = image;

优化后

在优化后,我们通过真机监测FPS在滚动时的变化,可以看到是比较稳定地处于60左右,说明优化的效果是比较明显的:

Color Misaligned Images

下面我们采用等比例的方式来生成新的图片并缓存起来,看到优化后的效果:

Color Misaligned Images

我们发现洋红色没有了,黄色也没有了。说明我们已经解决掉这个问题了。

等比例缩放

那么我们采用等比例缩放图片的代码如下(给UIImage添加了一个扩展方法):

// 等比缩放 - (UIImage *)hyb_cropEqualScaleImageToSize:(CGSize)size {     CGFloat scale =  [UIScreen mainScreen].scale;      // 这一行至关重要   // 不要直接使用UIGraphicsBeginImageContext(size);方法   // 因为控件的frame与像素是有倍数关系的   // [email protected] @[email protected] ,因此我们必须要指定scale,否则黄色去不了   // 因为在5以上,scale为2,6plus scale为3,所生成的图是要合苹果的   // 规格才能正常   UIGraphicsBeginImageContextWithOptions(size, NO, scale);      CGSize aspectFitSize = CGSizeZero;   if (self.size.width != 0 && self.size.height != 0) {     CGFloat rateWidth = size.width / self.size.width;     CGFloat rateHeight = size.height / self.size.height;          CGFloat rate = MIN(rateHeight, rateWidth);     aspectFitSize = CGSizeMake(self.size.width* rate, self.size.height* rate);   }      [selfdrawInRect:CGRectMake(0, 0, aspectFitSize.width, aspectFitSize.height)];   UIImage *image = UIGraphicsGetImageFromCurrentImageContext();   UIGraphicsEndImageContext();      return image; }

直接缩放至指定大小

下图是不按等比例来缩放,而是直接生成指定大小的图,优化后的效果图如下:

Color Misaligned Images

而我们生成指定大小的图的代码如下:

// 非等比缩放,生成的图片可能会被拉伸 - (UIImage *)hyb_cropEqualScaleImageToSize:(CGSize)size {   CGFloat scale =  [UIScreen mainScreen].scale;     UIGraphicsBeginImageContextWithOptions(size, NO, scale);      [selfdrawInRect:CGRectMake(0, 0, size.width, size.height)];   UIImage *image = UIGraphicsGetImageFromCurrentImageContext();   UIGraphicsEndImageContext();      return image; }

配置用户头像

配置用户头像处的代码就修改成如下,换成在子线程里处理图片裁剪,生成与headImageView正好合适的图片的大小,这样就不会出现图片需要UIImageView压缩的问题,性能自然得到提升:

// 优化后 dispatch_async(dispatch_get_global_queue(0, 0), ^{   NSString *path = nil;   if ([model.headImghasSuffix:@".png"]) {     path = model.headImg;   } else {   path = [[NSBundle mainBundle]pathForResource:model.headImgofType:nil];   }   UIImage *image = [[UIImageimageNamed:path]hyb_cropEqualScaleImageToSize:self.headImageView.frame.size];   dispatch_async(dispatch_get_main_queue(), ^{     self.headImageView.image = image;   }); });

配置CollectionViewCell

在优化后,我们在配置UICollectionView中的图片时,代码是这样的:

NSString *imgName = self.model.imgs[indexPath.row]; if ([self.model.cacheImagesobjectForKey:imgName]) {   imgView.image = [self.model.cacheImagesobjectForKey:imgName]; } else {      dispatch_async(dispatch_get_global_queue(0, 0), ^{          NSString *path = nil;     if ([imgNamehasSuffix:@".png"]) {       path = imgName;     } else {       path = [[NSBundle mainBundle]pathForResource:imgNameofType:nil];     }       UIImage *image = [[UIImageimageNamed:path]hyb_cropEqualScaleImageToSize:imgView.frame.size];     dispatch_async(dispatch_get_main_queue(), ^{       imgView.image = image;       if (image) {         [self.model.cacheImagessetObject:imageforKey:imgName];       }     });   }); }

我们首先是放在异步线程去去处图片的裁剪生成新的合适的图片,然后再回到主线程来更新显示图片。这么处理就不会阻塞主线程了,流畅度是否好多了~

注意事项

当我们设置不透明度为NO时,表示透明,这时候通过Color Blended Layers发现图片变成红色了,那是因为透明原因,将第二个参数设置成YES就可以解决了:

UIGraphicsBeginImageContextWithOptions(size, NO, scale);

最后

对于图片优化问题,个人觉得应该要根据情况而定,如果是在列表中需要滚动的,希望滚动可以很流畅的,才需要这么去优化它。对于那些不是滚动的界面,没有必须非得去优化它。

请大家多多反馈意见,说说自己的想法,在遇到问题能够将解决方案告知笔者,共同进步!

眼前还有三个月就要去深圳谋发展了,写下本篇,就当是提前准备准备吧!

总结

优化UIImageView显示出现图片大小与控件大小不一致时,可以采用重新生成新的正好合适的图片上这种方式。

同样像UIButton这样也需要显示图片时,也可以采用UIImageView这种方式

对新生成的图片,最好缓存起来

源代码

笔者提供了小Demo的,这个小demo也是如何在cell中嵌入collectionview的使用。

GITHUB下载地址: CoderJackyHuang’s PerformanceDemo

参考

UIKit性能调优实战讲解

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,053评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,527评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,779评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,685评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,699评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,609评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,989评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,654评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,890评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,634评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,716评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,394评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,976评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,950评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,191评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,849评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,458评论 2 342

推荐阅读更多精彩内容