您現在的位置是:電腦技術吧?>? 故障問題 ??>??ios性能優化的點,ios性能優化設置??>??正文詳情

ios性能優化的點,ios性能優化設置

冷荌荌2019-12-21 15:43:04 人圍觀
簡介iOS9優化最近,主要的項目是lbs,它是主要成員的定位功能。我們的用戶界面設計是這樣的,乍一看,它看起來非常漂亮。不同的人會展示不同的化身,但當人們在人群中時,問題就來了

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

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

  當人多的時候(例如上圖所示) 地圖滑動起來就能感覺到明顯頓卡 那種不流暢感能折磨死人 所以 自然我們要解決這個問題(等等 先不要吐槽為什么不用地圖聚合 因為這已經是地圖放到最大了 聚合不適合這次的問題討論)  分析  首先看下我是怎么實現這個annotationView的 由于這個annotationsView是異形的(也就是無法通過設置圓角直接得到) 而且里面的圖片還因用戶而異 所以解決方案就是使用layer.mask來進行遮罩 代碼如下  @implementation MMAnnotationView  - (instancetype)initWithAnnotation:(id)annotation reuseIdentifier:(NSString *)reuseIdentifier  {  self = [super initWithAnnotation:annotation reuseIdentifier:reuseIdentifier];  if ( self )  {  self.frame = CGRectMake(0, 0, TRACK_ANNOTATION_SIZE.width, TRACK_ANNOTATION_SIZE.height);  self.centerOffset = CGPointMake(0, -(TRACK_ANNOTATION_SIZE.height-3)/2);  self.canShowCallout = NO;  self.avatarView = [[UIImageView alloc] initWithFrame:self.bounds];  [self addSubview:self.avatarView];  self.avatarView.contentMode = UIViewContentModeScaleAspectFill;  CAShapeLayer *shapelayer = [CAShapeLayer layer];  shapelayer.frame = self.bounds;  shapelayer.path = self.framePath.CGPath;  self.avatarView.layer.mask = shapelayer;  self.layer.shadowPath = self.framePath.CGPath;  self.layer.shadowRadius = 1.0f;  self.layer.shadowColor = [UIColor colorWithHex:0x666666FF].CGColor;  self.layer.shadowOpacity = 1.0f;  self.layer.shadowOffset = CGSizeMake(0, 0);  self.layer.masksToBounds = NO;  }  return self;  }  //mask路徑  - (UIBezierPath *)framePath  {  if ( !_framePath )  {  CGFloat arrowWidth = 14;  CGMutablePathRef path = CGPathCreateMutable();  CGRect rectangle = CGRectInset(CGRectMake(0, 0, CGRectGetWidth(self.bounds), CGRectGetWidth(self.bounds)), 3,3);  CGPoint p[3] = {  {CGRectGetMidX(self.bounds)-arrowWidth/2, CGRectGetWidth(self.bounds)-6},  {CGRectGetMidX(self.bounds) arrowWidth/2, CGRectGetWidth(self.bounds)-6},  {CGRectGetMidX(self.bounds), CGRectGetHeight(self.bounds)-4}  };  CGPathAddRoundedRect(path, NULL, rectangle, 5, 5);  CGPathAddLines(path, NULL, p, 3);  CGPathCloseSubpath(path);  _framePath = [UIBezierPath bezierPathWithCGPath:path];  CGPathRelease(path);  }  return _framePath;  }  我用代碼生成了形狀路徑 并以此生成了layer的mask和shadowPath  使用時 只要直接用SDWebImage設置頭像就行了  1  [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了嗎? 試試看  - (void)loadAnnotationImageWithURL:(NSString*)url imageView:(UIImageView*)imageView  {  //將合成后的圖片緩存起來  NSString *annoImageURL = url;  NSString *annoImageCacheURL = [annoImageURL stringByAppendingString:@cache];  UIImage *cacheImage = [[SDImageCache sharedImageCache] imageFromDiskCacheForKey:annoImageCacheURL];  if ( cacheImage )  {  //LLLog(@hit cache);  imageView.image = cacheImage;  }  else  {  //LLLog(@no cache);  [imageView sd_setImageWithURL:[NSURL URLWithString:annoImageURL]  placeholderImage:placeHolderImage  completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, NSURL *imageURL) {  if (!error)  {  UIImage *annoImage = [image annotationImage];  imageView.image = annoImage;  [[SDImageCache sharedImageCache] storeImage:annoImage forKey:annoImageCacheURL];  }  }];  }  }  @implementation UIImage (LJC)  - (UIImage*) annotationImage  {  static UIView *snapshotView = nil;  static UIImageView *imageView = nil;  if ( !snapshotView )  {  snapshotView = [UIView new];  snapshotView.frame = CGRectMake(0, 0, TRACK_ANNOTATION_SIZE.width, TRACK_ANNOTATION_SIZE.height);  imageView = [UIImageView new];  [snapshotView addSubview:imageView];  imageView.clipsToBounds = YES;  imageView.frame = snapshotView.bounds;  imageView.contentMode = UIViewContentModeScaleAspectFill;  CGFloat arrowWidth = 14;  CGMutablePathRef path = CGPathCreateMutable();  CGRect rectangle = CGRectInset(CGRectMake(0, 0, CGRectGetWidth(imageView.bounds), CGRectGetWidth(imageView.bounds)), 3,3);  CGPoint p[3] = {  {CGRectGetMidX(imageView.bounds)-arrowWidth/2, CGRectGetWidth(imageView.bounds)-6},  {CGRectGetMidX(imageView.bounds) arrowWidth/2, CGRectGetWidth(imageView.bounds)-6},  {CGRectGetMidX(imageView.bounds), CGRectGetHeight(imageView.bounds)-4}  };  CGPathAddRoundedRect(path, NULL, rectangle, 5, 5);  CGPathAddLines(path, NULL, p, 3);  CGPathCloseSubpath(path);  CAShapeLayer *shapelayer = [CAShapeLayer layer];  shapelayer.frame = imageView.bounds;  shapelayer.path = path;  imageView.layer.mask = shapelayer;  snapshotView.layer.shadowPath = path;  snapshotView.layer.shadowRadius = 1.0f;  snapshotView.layer.shadowColor = [UIColor colorWithHex:0x666666FF].CGColor;  snapshotView.layer.shadowOpacity = 1.0f;  snapshotView.layer.shadowOffset = CGSizeMake(0, 0);  CGPathRelease(path);  }  imageView.image = self;  UIGraphicsBeginImageContextWithOptions(TRACK_ANNOTATION_SIZE, NO, 0);  [snapshotView.layer renderInContext:UIGraphicsGetCurrentContext()];  UIImage *copied = UIGraphicsGetImageFromCurrentImageContext();  UIGraphicsEndImageContext();  return copied;  }  @end  然后使用的時候 只要簡單的如下調用就OK了  [self loadAnnotationImageWithURL:avatarURL imageView:annotationView.avatarView];  看看修改之后的Instruments表現如何

  Color Blended Layers全中 這也是無可避免的 因為顯示的就是一張帶透明度的圖 但是由于地圖的特殊性(頭像的位置變化間隔較長 所以不會經常引發合成 也沒有動畫) 所以這里也不是問題  Color Misaligned Images沒問題了 因為頭像已被縮放成了相同大小  Color Offscreen-Rendered Yellow沒問題了 因為只是簡單的顯示了一張圖片 而并沒有需要離屏渲染的東西了  再來看下幀數情況

  Oh-Yeah~ 不光幀數達到了我們的目標60幀(由于還有業務邏輯線程在后臺跑 所以沒有那么的穩定) 就連平均運行耗時都下降了不少 就算地圖上再多顯示幾十個人 也不成問題了  小結  不光是MKMapView 其實包括UITableView在內的很多地方都可以用文中所說的方法去優化 其核心點就是 合成 緩存 當然 由于合成還是會耗費一部分資源的 所以比較適合頭像這種小的資源  關于圖形性能優化 可以看下這篇好文(有對文中提到的Debug Option不太明白的 這里有詳細的解釋)

版權聲明:本文由 冷荌荌 整理編輯。

原標題:ios開發性能優化,蘋果性能優化

轉載注明出處:http://www.dn9ww09s.icu/fault/15622.html

文章評論

    共有條評論來說兩句吧...

    用戶名:

    驗證碼:

作者推薦

  • 如何建立文件夾目錄,文件目錄怎么做

    如何建立文件夾目錄,文件目錄怎么做 相關圖片在文件夾下創建文件ASP根據用戶自定義的遠程圖像地址,自動下載圖像并上傳到服務器上,只是提供了一種思路,如果熟悉ASP,可以自己擴展它。如何創建文件夾做文檔...

  • excel文件亂碼怎么恢復,文檔亂碼怎么恢復

    excel文件亂碼怎么恢復,文檔亂碼怎么恢復 相關圖片導出excel表格出現亂碼CSV文件可以通過Excel打開和操作。同時,用PHP導入CSV文件非常容易,所以我們通常用PHP導出CSV,但有時用Excel打開CSV時會遇到代碼混亂的問題csv格式打開亂碼...

  • 觸動精靈腳本編寫教程,按鍵精靈腳本制作教程

    觸動精靈腳本編寫教程,按鍵精靈腳本制作教程 相關圖片腳本模板本文主要介紹編寫Python CGI腳本的教程。CGI是Python和服務器軟件之間的接口。如果你需要一個朋友,你可以參考是用Python語言創建一個web頁面手機按鍵精靈腳本制作教程...

  • Android內存泄露,Android內存泄漏

    Android內存泄露,Android內存泄漏 相關圖片安卓內存溢出的原因本文主要介紹Android加載圖片時內存溢出問題的解決方案。本文介紹如何使用bitmapfactory.options解決內存溢出問題。請參考以下1。在AndrAndroid系統內存出錯怎么辦...

  • 數據庫運算符,數據庫比較運算符

    數據庫運算符,數據庫比較運算符 相關圖片數據類型運算符與表達式如果您最近執行了select或update查詢,則可能會使用一個或多個MySQL比較運算符來限制查詢的輸出。比較是大多數select查詢不可分割的一部分,MyS數據庫四大運算符...

  • 表格中怎么使用函數,函數在表格中怎么使用

    表格中怎么使用函數,函數在表格中怎么使用 相關圖片表格中如何用函數在使用SQL的過程中,我們偶爾會遇到需要更改數據存儲形式的情況。例如,數據庫的表(info)中有一個字段education,用于存儲JSON數組。現在,由于需求表格中函數的應...

  • weblogic并發連接數,iis最大并發連接數

    weblogic并發連接數,iis最大并發連接數 相關圖片udp并發連接數無法連接到Oracle數據庫。相關錯誤oerr:ora-12519 TNS:未找到適當的服務處理程序。客戶端連接間歇性失敗。Ora-12519原因:LIStomcat并發連接數...

  • url帶參數,url傳參數

    url帶參數,url傳參數 相關圖片url參數錯誤本文的例子描述了用JavaScript獲取URL查詢參數的方法。與您分享以供參考。具體實現方法如下:?12345678910函數getqueryvariableurl是啥...

  • 探索發現筆記,探索筆記怎么開啟

    探索發現筆記,探索筆記怎么開啟 相關圖片紫水宮探索筆記什么是UI測試?UI測試是一個自動測試UI和交互的測試組件。UI測試有什么用?它可以通過編寫代碼或記錄開發人員的操作過程和編碼,自動點擊按鈕、查看或輸入文本。用...

  • asp_html,asp就是html嗎

    asp_html,asp就是html嗎 相關圖片html打開asp頁面巧用ASP語言過濾HTML元素:“過濾HTML”函數名:glhtml“函數:過濾HTML元素”參數:STR----過濾字符“返回值:無HTML字符”******asp和php...

熱評文章

  • asp是什么,asp和php

    asp是什么,asp和php 相關圖片net是啥ASP。NETC生成隨機數類文件,并根據需要生成一些隨機數。最大值和最小值可以自行設定。代碼很簡單,可以放在公共庫中進行調用。類代碼如下:asp.net和php的區別...

  • javascript 回調函數,nodejs回調函數

    javascript 回調函數,nodejs回調函數 相關圖片前端回調函數本文的例子描述了JavaScript中帶有回調函數的異步腳本加載方法。與您分享以供參考。具體實現方法如下:?12345678910121314151617181什么是回調函數...

  • oracle如何導入數據,oracle數據庫導入數據

    oracle如何導入數據,oracle數據庫導入數據 相關圖片oracle 導入本文介紹了Oracle數據的導入和導出、IMP命令和exp命令,并對它們的相關參數進行了說明。然后通過一些例子,加深我們的理解。最后,本文討論了在使用這兩個命令oracle導入...

  • 日歷跳轉指定日期,計算指定日期的年齡

    日歷跳轉指定日期,計算指定日期的年齡 相關圖片朋友圈指定日期讓我們了解一下:雖然我們不能在access中使用DateDiff函數,但是我們可以使用date函數來實現這個函數。讓我們來看看下面這個巨大的例子,即如何選擇前8朋友圈怎么看指...

  • 安全備份的策略,備份方案及策略

    安全備份的策略,備份方案及策略 相關圖片常見的系統備份策略有在數據庫表丟失或損壞的情況下備份數據庫很重要。如果發生系統崩潰,您希望能夠將表還原到崩潰發生的狀態,同時盡可能減少數據丟失。本文主要對MyISAM表進...

  • 什么是構造函數重載,構造函數怎么重載

    什么是構造函數重載,構造函數怎么重載 相關圖片構造函數和析構函數重載本文主要介紹了C 中構造函數重載的相關信息,非常詳細。對于您的朋友,請參閱“12345678910121314151617181920212223242526什么是復制構造函數重載...

  • ps漸變步驟,ps漸變的運用

    ps漸變步驟,ps漸變的運用 相關圖片ps漸變人物本文通過一個實例說明了PHP如何使用GD實現顏色漸變。與您分享以供參考。具體實現方法如下:?1234567891011?PHP$im=imagecreate(2漸變編輯器的使用...

  • 如何將字符串轉化為數組,如何將字符串轉為日期

    如何將字符串轉化為數組,如何將字符串轉為日期 相關圖片將字符串轉換為日期下面是將文本文件或字符串轉換為圖片的示例。調用方法:C?code converttextfiletoimage(服務器。映射路徑(~/data。Txt),服務器如何將字符串轉換成日期...

  • 什么是數據壓縮,AIC23數據壓縮

    什么是數據壓縮,AIC23數據壓縮 相關圖片數據庫數據壓縮數據壓縮使用gzip處理壓縮的響應數據。從0.9版開始,asihttprequest將提示服務器它可以接收gzip壓縮數據。很多web服務器可以在數據發送之前對數據壓縮原理...

  • 語法分析器,漢語語法基礎知識

    語法分析器,漢語語法基礎知識 相關圖片英語語法分析軟件HTML注釋在客戶端顯示注釋。JSP語法!--注釋[%=expression%]--示例1!--這個文件在客戶機上顯示用戶登錄屏幕--HT英語語法改錯...

關注微信

变脸官网查询