精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

一次對MKMapView的性能優化

移動開發 iOS
當人多的時候(例如上圖所示) 地圖滑動起來就能感覺到明顯頓卡 那種不流暢感能折磨死人 所以 自然我們要解決這個問題(等等 先不要吐槽為什么不用地圖聚合 因為這已經是地圖放到最大了 聚合不適合這次的問題討論)

最近做的項目主要是LBS這塊 主打成員定位功能 我們的UI設計是這樣的

 

乍一看上去是挺好挺美觀的 不同的人會顯示不同的頭像 可是當人扎堆的時候 問題就來了

 

當人多的時候(例如上圖所示) 地圖滑動起來就能感覺到明顯頓卡 那種不流暢感能折磨死人 所以 自然我們要解決這個問題(等等 先不要吐槽為什么不用地圖聚合 因為這已經是地圖放到***了 聚合不適合這次的問題討論)

分析

首先看下我是怎么實現這個annotationView的 由于這個annotationsView是異形的(也就是無法通過設置圓角直接得到) 而且里面的圖片還因用戶而異 所以解決方案就是使用layer.mask來進行遮罩 代碼如下

  1. @implementation MMAnnotationView 
  2. - (instancetype)initWithAnnotation:(id)annotation reuseIdentifier:(NSString *)reuseIdentifier 
  3. self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier]; 
  4. if ( self ) 
  5. self.frame = CGRectMake(00, TRACK_ANNOTATION_SIZE.width, TRACK_ANNOTATION_SIZE.height); 
  6. self.centerOffset = CGPointMake(0, -(TRACK_ANNOTATION_SIZE.height-3)/2); 
  7. self.canShowCallout = NO; 
  8. self.avatarView = [[UIImageView alloc] initWithFrame:self.bounds]; 
  9. [self addSubview:self.avatarView]; 
  10. self.avatarView.contentMode = UIViewContentModeScaleAspectFill; 
  11. CAShapeLayer *shapelayer = [CAShapeLayer layer]; 
  12. shapelayer.frame = self.bounds; 
  13. shapelayer.path = self.framePath.CGPath; 
  14. self.avatarView.layer.mask = shapelayer; 
  15. self.layer.shadowPath = self.framePath.CGPath; 
  16. self.layer.shadowRadius = 1.0f; 
  17. self.layer.shadowColor = [UIColor colorWithHex:0x666666FF].CGColor; 
  18. self.layer.shadowOpacity = 1.0f; 
  19. self.layer.shadowOffset = CGSizeMake(00); 
  20. self.layer.masksToBounds = NO; 
  21. return self; 
  22. //mask路徑 
  23. - (UIBezierPath *)framePath 
  24. if ( !_framePath ) 
  25. CGFloat arrowWidth = 14
  26. CGMutablePathRef path = CGPathCreateMutable(); 
  27. CGRect rectangle = CGRectInset(CGRectMake(00, CGRectGetWidth(self.bounds), CGRectGetWidth(self.bounds)), 3,3); 
  28. CGPoint p[3] = { 
  29. {CGRectGetMidX(self.bounds)-arrowWidth/2, CGRectGetWidth(self.bounds)-6}, 
  30. {CGRectGetMidX(self.bounds)+arrowWidth/2, CGRectGetWidth(self.bounds)-6}, 
  31. {CGRectGetMidX(self.bounds), CGRectGetHeight(self.bounds)-4
  32. }; 
  33. CGPathAddRoundedRect(path, NULL, rectangle, 55); 
  34. CGPathAddLines(path, NULL, p, 3); 
  35. CGPathCloseSubpath(path); 
  36. _framePath = [UIBezierPath bezierPathWithCGPath:path]; 
  37. CGPathRelease(path); 
  38. return _framePath; 
  39.  
  40. 我用代碼生成了形狀路徑 并以此生成了layer的mask和shadowPath 
  41.  
  42. 使用時 只要直接用SDWebImage設置頭像就行了 
  43. 1 
  44.  
  45. [annotationView.avatarView sd_setImageWithURL:[NSURL URLWithString:avatarURL] placeholderImage:placeHolderImage]; 

 

接下來用工具分析一下問題出來哪 分析性能當然是選擇Instrments(用法在這里就不做介紹了) 打開Core Animation 然后運行程序 滑動地圖 可以看到性能分析如下

原來平均幀數只有不到30幀 這離我們的目標60幀差得實在太遠

再使用Debug Option來深入分析一下

由于MKMapView的原因 這里我們主要關心這幾個選項

Color Blended Layers

Color Misaligned Images

Color Offscreen-Rendered Yellow

分別打開這幾個選項 結果如下

 

可以看到

Color Blended Layers沒有問題 不過這也是正常的 由于使用了mask 沒有透明的地方

Color Misaligned Images除了默認頭像外全中 這是因為服務器上的圖片大小跟顯示的大小不一致 導致縮放 而默認頭像則是一致的 所以沒問題

Color Offscreen-Rendered Yellow全中 由于使用了mask 導致大量的離屏渲染 這也是性能下降的主要原因

解決

問題的原因找到了 那么接下來該如何解決呢?

首先mask是肯定不能用了

其次下載下來的圖片我們要預處理成實際大小

那么 直接把下載下來的圖片合成為我們要顯示的最終結果不就ok了嗎? 試試看

  1. - (void)loadAnnotationImageWithURL:(NSString*)url imageView:(UIImageView*)imageView 
  2. //將合成后的圖片緩存起來 
  3. NSString *annoImageURL = url; 
  4. NSString *annoImageCacheURL = [annoImageURL stringByAppendingString:@"cache"]; 
  5. UIImage *cacheImage = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:annoImageCacheURL]; 
  6. if ( cacheImage ) 
  7. //LLLog(@"hit cache"); 
  8. imageView.image = cacheImage; 
  9. else 
  10. //LLLog(@"no cache"); 
  11. [imageView sd_setImageWithURL:[NSURL URLWithString:annoImageURL] 
  12. placeholderImage:placeHolderImage 
  13. completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) { 
  14. if (!error) 
  15. UIImage *annoImage = [image annotationImage]; 
  16. imageView.image = annoImage; 
  17. [[SDImageCache sharedImageCache] storeImage:annoImage forKey:annoImageCacheURL]; 
  18. }]; 
  19. @implementation UIImage (LJC) 
  20. - (UIImage*) annotationImage 
  21. static UIView *snapshotView = nil; 
  22. static UIImageView *imageView = nil; 
  23. if ( !snapshotView ) 
  24. snapshotView = [UIView new]; 
  25. snapshotView.frame = CGRectMake(00, TRACK_ANNOTATION_SIZE.width, TRACK_ANNOTATION_SIZE.height); 
  26. imageView = [UIImageView new]; 
  27. [snapshotView addSubview:imageView]; 
  28. imageView.clipsToBounds = YES; 
  29. imageView.frame = snapshotView.bounds; 
  30. imageView.contentMode = UIViewContentModeScaleAspectFill; 
  31. CGFloat arrowWidth = 14
  32. CGMutablePathRef path = CGPathCreateMutable(); 
  33. CGRect rectangle = CGRectInset(CGRectMake(00, CGRectGetWidth(imageView.bounds), CGRectGetWidth(imageView.bounds)), 3,3); 
  34. CGPoint p[3] = { 
  35. {CGRectGetMidX(imageView.bounds)-arrowWidth/2, CGRectGetWidth(imageView.bounds)-6}, 
  36. {CGRectGetMidX(imageView.bounds)+arrowWidth/2, CGRectGetWidth(imageView.bounds)-6}, 
  37. {CGRectGetMidX(imageView.bounds), CGRectGetHeight(imageView.bounds)-4
  38. }; 
  39. CGPathAddRoundedRect(path, NULL, rectangle, 55); 
  40. CGPathAddLines(path, NULL, p, 3); 
  41. CGPathCloseSubpath(path); 
  42. CAShapeLayer *shapelayer = [CAShapeLayer layer]; 
  43. shapelayer.frame = imageView.bounds; 
  44. shapelayer.path = path; 
  45. imageView.layer.mask = shapelayer; 
  46. snapshotView.layer.shadowPath = path; 
  47. snapshotView.layer.shadowRadius = 1.0f; 
  48. snapshotView.layer.shadowColor = [UIColor colorWithHex:0x666666FF].CGColor; 
  49. snapshotView.layer.shadowOpacity = 1.0f; 
  50. snapshotView.layer.shadowOffset = CGSizeMake(00); 
  51. CGPathRelease(path); 
  52. imageView.image = self; 
  53. UIGraphicsBeginImageContextWithOptions(TRACK_ANNOTATION_SIZE, NO, 0); 
  54. [snapshotView.layer renderInContext:UIGraphicsGetCurrentContext()]; 
  55. UIImage *copied = UIGraphicsGetImageFromCurrentImageContext(); 
  56. UIGraphicsEndImageContext(); 
  57. return copied; 
  58. @end 

然后使用的時候 只要簡單的如下調用就OK了

  1. [self loadAnnotationImageWithURL:avatarURL imageView:annotationView.avatarView]; 

看看修改之后的Instruments表現如何

 

Color Blended Layers全中 這也是無可避免的 因為顯示的就是一張帶透明度的圖 但是由于地圖的特殊性(頭像的位置變化間隔較長 所以不會經常引發合成 也沒有動畫) 所以這里也不是問題

Color Misaligned Images沒問題了 因為頭像已被縮放成了相同大小

Color Offscreen-Rendered Yellow沒問題了 因為只是簡單的顯示了一張圖片 而并沒有需要離屏渲染的東西了

再來看下幀數情況

 

Oh-Yeah~ 不光幀數達到了我們的目標60幀(由于還有業務邏輯線程在后臺跑 所以沒有那么的穩定) 就連平均運行耗時都下降了不少 就算地圖上再多顯示幾十個人 也不成問題了

小結

不光是MKMapView 其實包括UITableView在內的很多地方都可以用文中所說的方法去優化 其核心點就是 合成+緩存 當然 由于合成還是會耗費一部分資源的 所以比較適合頭像這種小的資源

關于圖形性能優化 可以看下這篇好文(有對文中提到的Debug Option不太明白的 這里有詳細的解釋)

責任編輯:chenqingxiang 來源: 里脊串的開發隨筆
相關推薦

2019-03-19 14:52:00

性能優化MySQL數據庫

2020-06-05 08:53:31

接口性能實踐

2020-08-10 11:00:02

Python優化代碼

2021-03-12 15:08:23

服務器性能優化

2011-09-27 10:35:44

2011-02-22 09:29:23

jQueryJavaScript

2023-11-06 07:45:42

單據圖片處理

2020-10-30 14:11:38

服務器SDK堆棧

2021-08-26 22:26:55

性能優化技術

2021-03-18 23:47:18

MySQLselect索引

2022-09-15 10:02:58

測試軟件

2011-06-28 10:41:50

DBA

2022-06-08 09:55:19

Data Catal字節跳動業務系統

2021-01-08 13:52:15

Consul微服務服務注冊中心

2020-10-27 10:35:38

優化代碼項目

2020-10-24 13:50:59

Python編程語言

2021-12-27 10:08:16

Python編程語言

2020-04-17 10:53:38

釣魚郵件網絡攻擊冠狀病毒

2013-12-23 15:46:42

2016-09-08 22:54:14

點贊
收藏

51CTO技術棧公眾號

在线观看亚洲一区二区| 中文在线观看免费视频| av电影在线观看| 肉丝袜脚交视频一区二区| 亚洲人成电影在线观看天堂色| 欧美狂野激情性xxxx在线观| 色香蕉在线视频| 欧美一级网站| 日日骚久久av| avtt中文字幕| 国产99在线观看| 久久影音资源网| 国产精品夜间视频香蕉| 69av视频在线| 欧美在线导航| 欧美日韩高清一区| 精品人妻大屁股白浆无码| 婷婷在线免费观看| 免费在线观看日韩欧美| 色综合久久精品亚洲国产| 久久中文字幕人妻| 国产精品2区| 精品国产成人在线| 国产日本欧美在线| 亚洲日本中文字幕在线| 免费欧美日韩国产三级电影| 欧美韩国理论所午夜片917电影| 国产成人无码一区二区在线观看| 一呦二呦三呦精品国产| 亚洲精品老司机| 欧美极品一区| 99久久99久久久精品棕色圆| 亚洲一区激情| 久久777国产线看观看精品| 亚洲熟妇无码av| 日韩精品一区二区三区中文| 在线免费不卡电影| 国产一线二线三线女| 国产天堂在线| 成人av在线一区二区| 国产精品永久在线| 香蕉影院在线观看| 91久久夜色精品国产按摩| 日韩黄色高清视频| 日本亚洲一区二区三区| 欧美极品videos大乳护士| 中文字幕一区二区不卡| 欧美日韩一区二区三区在线视频| www.色视频| 麻豆国产精品777777在线| 欧美在线xxx| 欧美黄色一级网站| 国产精品97| 亚洲欧美在线一区| 成人性生活免费看| 亚洲欧美日本国产| 欧美一区二区三区影视| 亚洲综合欧美在线| 美女100%一区| 色综合网站在线| 精品久久一二三| xxxx视频在线| 亚洲午夜av在线| 青青草视频国产| 麻豆tv在线| 亚洲欧洲精品成人久久奇米网| 欧美第一黄网| 免费观看的毛片| 另类欧美日韩国产在线| 国产精品久久久久久中文字| 国产黄网在线观看| 久久精品动漫| 国产精品777| 日本熟女一区二区| 最新国产乱人伦偷精品免费网站| 欧美精品激情blacked18| 九九久久免费视频| 亚洲午夜黄色| 精品国内自产拍在线观看视频| 国产精品嫩草影院com| 日韩视频在线播放| 国外av在线| 国产免费久久精品| 亚洲高清视频一区二区| 在线视频1区2区| 国产精品久久久一本精品| 中文字幕在线观看一区二区三区| 欧美三级黄网| 一区二区在线看| 国产96在线 | 亚洲| 极品视频在线| 日本韩国视频一区二区| 国产h视频在线播放| 在线观看福利电影| 欧美性猛片xxxx免费看久爱| wwwwww.色| 日本午夜精品久久久久| 日韩免费观看高清完整版在线观看| 91视频免费入口| 欧美变态挠脚心| 亚洲一区二区久久| 亚洲精品自拍视频在线观看| 午夜精品偷拍| 九九热r在线视频精品| 国产精品99精品| 久色成人在线| 1区1区3区4区产品乱码芒果精品| 秋霞av鲁丝片一区二区| 欧美在线日韩| 国产精品久久久久久久久搜平片| 欧美日韩综合网| 青青青青在线| 一区二区三区日韩欧美精品 | 国产无遮挡裸体免费久久| 亚洲国产三级网| 手机av免费看| 99re66热这里只有精品8| 欧美激情在线一区| 中文字幕日日夜夜| 国产成人福利片| 日韩福利影院| 欧美6一10sex性hd| 欧美天堂亚洲电影院在线播放| 巨乳女教师的诱惑| 九九综合久久| 欧美激情综合亚洲一二区| 国产成人无码一区二区在线播放| 国产一区二区三区国产| 欧美日韩电影一区二区| av在线free| 色悠久久久久综合欧美99| 俄罗斯女人裸体性做爰| 精品免费av| 国产成人在线网站| 在线中文字幕日韩| 久久一二三四区| 毛片基地黄久久久久久天堂| 国产一区免费在线| 欧美极品另类| 亚洲午夜国产一区99re久久| 色一情一区二区| 欧美日韩爱爱| 性欧美在线看片a免费观看| 国产三级视频在线播放| 国产欧美精品日韩区二区麻豆天美| 国产精品va在线观看无码| 美女视频一区| 在线色欧美三级视频| 91美女免费看| 高清在线成人网| 天堂av免费看| 亚洲www免费| 亚洲精品久久久久久下一站 | 欧美激情亚洲视频| 精品国产九九九| 一区二区三区波多野结衣在线观看 | 午夜在线小视频| 欧美日韩一区在线观看| 国产黄色录像视频| 另类小说一区二区三区| 成年人黄色在线观看| 男女男精品视频网站| 好吊妞视频这里有精品| 性色av一区二区三区免费 | 中文在线免费视频| 亚洲欧美国产va在线影院| 台湾佬中文在线| 中文字幕免费一区| 亚洲欧美日本一区二区| 一本一道久久a久久精品蜜桃| 亚洲伊人久久大香线蕉av| 丝袜在线视频| 亚洲国产毛片完整版| 久久久久女人精品毛片九一| 国产日韩综合av| 国产福利精品一区二区三区| 欧美一区精品| 久久99导航| 日韩五码电影| 久久久久久久久国产| 日本人妖在线| 69堂精品视频| 日本少妇在线观看| 国产亚洲精品资源在线26u| 亚洲三级在线观看视频| 在线观看视频免费一区二区三区| 蜜桃网站成人| 国产欧美视频在线| 欧美一区二区大胆人体摄影专业网站| 91在线播放网站| 精品美女被调教视频大全网站| 欧产日产国产69| 亚洲日本在线视频观看| 中文字幕av观看| 捆绑调教一区二区三区| 国产av天堂无码一区二区三区| 精品一区二区三| 99久久一区三区四区免费| 亚洲精品福利电影| 久热精品视频在线观看一区| 日韩有码电影| 欧美一级精品大片| 国产免费一区二区三区四区五区| 亚洲精品视频自拍| b站大片免费直播| 国产精品18久久久久久久久久久久 | 欧美日韩美女视频| www.av免费| 久久免费电影网| 日韩av成人网| 久久国内精品自在自线400部| 欧美日产国产精品| 偷拍女澡堂一区二区三区| 韩国成人在线视频| 国产精品人人妻人人爽人人牛| 欧美.www| 亚洲一区三区视频在线观看| 日韩电影不卡一区| 国产精品播放| 中文幕av一区二区三区佐山爱| 欧美一级片在线播放| 视频在线这里都是精品| 中文字幕精品—区二区| 青青草超碰在线| 亚洲成色777777女色窝| 国产人妖一区二区三区| 精品视频在线视频| 波多野结衣激情视频| 欧美日韩亚洲高清| 国产精品白浆一区二小说| 中文字幕亚洲精品在线观看 | 天天久久夜夜| 都市激情久久久久久久久久久| 久久国内精品| 国产精品免费观看在线| 日韩精品专区| 欧美在线一区二区三区四| 大黄网站在线观看| 欧美成人激情在线| 免费网站黄在线观看| 中文字幕久久久av一区| www亚洲人| 国产亚洲精品久久久久动| 精品久久久久一区二区三区| 日韩精品视频在线观看免费| 欧美在线 | 亚洲| 亚洲国产精品电影| 天堂中文在线资源| 亚洲精品成人网| 香蕉视频免费在线看| 亚洲国产欧美一区二区三区同亚洲 | 久久日韩视频| 久久深夜福利免费观看| 久久综合网导航| 精品国产一区二区三区久久狼5月 精品国产一区二区三区久久久狼 精品国产一区二区三区久久久 | 亚洲AV无码国产精品午夜字幕 | 精品国精品国产自在久国产应用| 麻豆亚洲一区| 久久综合欧美| 日韩一区不卡| 久久精品播放| 国产免费xxx| 激情久久久久久| 91成人在线观看喷潮教学| 国产一级一区二区| 成年人视频在线免费| 蜜臀av性久久久久蜜臀aⅴ四虎| 在线观看免费成人av| 激情综合网天天干| av不卡中文字幕| caoporn国产精品| 法国空姐电影在线观看| 国产精品毛片a∨一区二区三区| 男人晚上看的视频| 亚洲午夜久久久久久久久电影网| 国产69精品久久久久久久久久| 欧美午夜精品久久久久久久| 中文在线字幕免费观| 91麻豆精品国产91久久久久久久久 | 国产欧美一区二区三区另类精品| 一级aaaa毛片| 国产欧美日韩综合| 精品人妻伦九区久久aaa片| 一区二区欧美在线观看| 日韩精品在线免费视频| 欧美日韩在线一区二区| 亚洲精品久久久久久久久久| 国产婷婷97碰碰久久人人蜜臀| 日本三级视频在线观看| 久久久久久久久久婷婷| 免费观看亚洲| 91免费视频网站| 免费观看久久av| 黄色高清视频网站| 国产模特精品视频久久久久| 五月婷婷六月合| 成人av免费在线播放| 夫妇交换中文字幕| 午夜伦欧美伦电影理论片| 亚洲天堂视频网| 精品国精品国产尤物美女| 国产区高清在线| 久久久在线观看| 成人黄色毛片| 久久精品日产第一区二区三区乱码 | 久久在线精品| 中文字幕乱妇无码av在线| 久久久久国产精品免费免费搜索| 欧美又粗又大又长| 欧美性xxxxx极品少妇| 亚洲乱色熟女一区二区三区| 在线看福利67194| 中文日产幕无线码一区二区| 91传媒视频在线观看| 成人在线一区| 精品99在线视频| 丁香激情综合五月| 成人精品久久久| 成人在线免费看片| 国产精品成人播放| 天天做夜夜做人人爱精品| 男女裸体影院高潮| 日韩 欧美一区二区三区| 添女人荫蒂视频| 亚洲国产精品天堂| av无码精品一区二区三区宅噜噜| 国产亚洲美女精品久久久| 黄频免费在线观看| 国产精品对白一区二区三区| 国产精品99一区二区三| 色婷婷狠狠18| 中文字幕欧美日本乱码一线二线| 亚洲欧美一区二区三区在线观看| 亚洲福利视频在线| 丁香高清在线观看完整电影视频| 亚洲japanese制服美女| 99九九热只有国产精品| 亚洲色图38p| 久久九九全国免费| 欧美特黄aaaaaa| 亚洲电影在线观看| aa国产成人| 狠狠爱一区二区三区| 亚洲第一精品影视| 亚洲熟女一区二区三区| 一卡二卡三卡日韩欧美| 国产wwwxxx| 欧美麻豆久久久久久中文| 久久丁香四色| 日本三级中文字幕在线观看| 国模娜娜一区二区三区| 欧美三级黄色大片| 日韩西西人体444www| 色呦呦在线播放| 激情五月综合色婷婷一区二区 | 粗暴蹂躏中文一区二区三区| 国产成人久久精品一区二区三区| 日本成人性视频| 国产馆精品极品| 精品小视频在线观看| 亚洲国内精品视频| 欧美电影免费观看| 亚洲国产一区二区在线| 老司机午夜精品| 国产女片a归国片aa| 欧美成人一区二区三区片免费| 黄色污污视频在线观看| 久久久久久久久久久久久9999| 午夜亚洲视频| 在线观看亚洲大片短视频| 欧美精品自拍偷拍| 美女91在线| 国产亚洲欧美激情| 国产亚洲色婷婷久久99精品| 亚洲国产中文字幕久久网| 日韩大片欧美大片| 欧美日韩视频免费在线观看| 成人午夜精品在线| 午夜精品免费观看| 中文字幕亚洲欧美| 中文字幕一区二区三区中文字幕 | 久久久精品日韩| 在线观看日本黄色| 欧美xxxx老人做受| 欧美电影免费观看| 青草全福视在线| 26uuu久久天堂性欧美| 这里只有精品6| av网站在线免费看| 亚洲综合色成人| 西西人体44www大胆无码| 国产精品高潮在线| 午夜精品久久久久99热蜜桃导演 | 天堂网av手机版| 深夜福利一区二区| 黄色网一区二区| 亚洲综合欧美在线| 五月婷婷久久综合| 免费高清在线观看| 久久一区免费|