ios效能優化相關

weixin_33890499發表於2018-09-12

cpu和gpu都是幹什麼的

cpu:主要是用來處理 比如尺寸的計算、文字的排版、圖片的格式轉換和解碼等等相關的
gpu:主要是紋理的渲染
ios中是雙快取機制,有前幀快取和後幀快取。

產生卡頓的原因

我們都知道我們的螢幕重新整理是沒60FPS也就是1000/60大概就是16ms重新整理一下也就是來一次垂直的訊號,我們重新整理是由水平訊號和垂直訊號共同組成的,但是當我們的cpu或者gpu佔用的大量的資源或者我們需要計算的資源有點多的時候,那麼很有可能我們的水平訊號還沒有傳送完畢那麼垂直訊號就來,但是這時候我們的水平訊號還沒有完成,所以這種情況顯示的就是我們上一次的水平訊號,這就是產生卡卡頓的原因。


7935076-6cbef116d9833295.png
image.png

知道原因我們避免螢幕卡段的方法就是減少cpu還有gpu的消耗。

卡頓優化cpu上的

1.儘量用輕量級的物件,在沒有事件處理的地方可以考慮用CALayer代替UIView。
2.不要頻繁的設定uiview的相關屬相,比如frame、bound、size等,在需要的時候在改動。
3.儘量提前做好佈局、在需要改動的地方一次性的修改好。

  1. AutoLayout比frame耗費的資源更多.

5.圖片的size最好跟imgaeview的size大小一致。
6.控制一下最大併發數量。GCD可以很好的控制 NSOperation也能很好的控制。
7.儘量把耗時的操作放到子執行緒中去。

卡頓優化gpu上的

1.如果可能儘量將多張圖片合成一張圖片顯示
2.gpu能處理圖片的最大尺寸是4096*4096,那麼圖片最好不要超過這麼大,如果超過了那麼就會佔用cpu的資源。
3.儘量減少檢視數量和層數。
4.如果可能儘量不要改動透明度,也就是我們預設的不透明度為1.
5.避免出現離屏渲染。

離屏渲染和優化

gpu渲染方式有兩種:
1.當前螢幕渲染:在當前螢幕中進行渲染
2.離屏渲染:離開當前螢幕,新開闢一塊資源,進行離屏渲染.
離屏渲染產生卡頓的原因:
需要從當前的螢幕切換到離屏,當離屏渲染結束後需要將渲染結果返回到當前螢幕,這時候上下文環境又需要切換到當前螢幕。
什麼操作會觸發離屏渲染呢?(都拿self.view作為例子)
1.光柵化

self.view.layer.shouldRasterize = YES;

2.遮罩

self.view.layer.mask = [CALayer layer];

3.圓角,需要同時設定這兩個屬性,才會觸發離屏渲染

    self.view.layer.cornerRadius = 10;
    self.view.layer.masksToBounds = YES;

4.陰影設定,如果設定陰影路徑了那麼不會觸發離屏渲染

  // 陰影
    self.view.layer.shadowXXXXXXX
// 設定陰影路徑了那麼不會觸發離屏渲染
    self.view.layer.shadowPath = nil;

卡頓檢查

我們的方案是通過新增觀察者放到runloop中,觀察runloop中狀態改變的耗時來判斷卡頓與否。
通過一個工具我們來檢查我們的程式碼。git上搜尋:
LXDAppFluecyMonitor
如果我們那些程式碼出現卡頓就會定位到那一行。
比如:


7935076-676b074cee6c4793.png
image.png

耗電的主要來源

1.cpu消耗
2.請求網路
3.定位,地圖相關的。
4.影象的處理

耗電的優化

1.儘可能的降低cpu和gpu的操作
2.少用定時器
3.i/o操作
3.1儘量不要頻繁的寫入資料,可以考慮批量的寫入資料。可以使用dispatch_io操作,他優化了磁碟的處理。
3.2資料量比較大的時候使用coredata、或者fmdb或者realm等相關的。不要運用plist檔案儲存等
4 網路優化
4.1壓縮傳輸的格式,可以考慮用json或者protobuf
4.2多次請求獲取的結果一樣的時候可以考慮用快取
4.3上傳或者下載大的時候可以考慮用斷點續傳。
4.4請求的時候最好加上超時的操作,不能不設定超時時間
4.5在網路不好的時候不能一直處於載入狀態。
5.定位優化
5.1如果只是需要快速定位使用者的位置,只需要快速定位CLLocationManager中的requestLocation方法就行了,定位完成後會自動斷電。
5.2如果不是導航的應用,儘量不要時時更新位置,定位完畢就關掉定位服務。
5.3儘量的降低定位的精度,儘量不要使用精準定位KCLLocationAccuracyBest
5.4需要後臺定位更新時候儘量設定pauseLocationUpdatesAutomatically = Yes,這樣的話使用者不太可能移動的時候就會暫定定位服務。

app啟動

7935076-a8325fd66255e816.png
image.png

7935076-117823fa68375ae8.png
image.png

可以看到載入的時間是955毫秒。


7935076-24519bee6db21ae4.png
image.png

APP的啟動-dyld

apple的動態聯結器。用來裝在mach-o檔案的(可執行檔案或者動態庫等)
他所做的事情有:
裝載app的可執行檔案同時會遞迴載入所有的動態依賴庫
執行完畢之後會到runtime的執行過程。

app啟動runtime所做的事情

1呼叫map_iamges進行可執行檔案的解析和處理
2.呼叫所有的類的或者分類的load方法
3.進行各種objc結構的初始化(註冊objc類,初始化類物件等等)
4.呼叫c++靜態初始化器和attributes_修飾的函式
5.到此時為止,所有的class、類、協議、等等都已經載入進記憶體中,被runtime處理。

app啟動 main函式

經過前兩部的操作,那麼就開始呼叫app的UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));方法了。

啟動優化(主要是針對冷啟動)

根據不同階段
1.1減少動態庫,或者能夠合併的合併
1.2減少objc類或者分類或者@selector的數量
1.3減少c++虛擬函式的數量

2.1用+(void)initialize{

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    
});

}
代替所有的attributes_修飾的函式或者或者load函式

3.1在不影響邏輯操作等等的前提下,儘可能的不要將很多的方法放在didfinishlanuch方法中。按需操作。

安裝包瘦身的操作

資原始檔瘦身,
可以到github下載這個mac app來檢測我們沒有用到的資源
https://github.com/tinymind/LSUnusedResources
安裝包瘦身

7935076-1384be4654b3442a.png
image.png

到這個網站去下載 工具 可以檢查刪除無用的程式碼:
https://www.jetbrains.com/objc/download/(30天免費使用)
檢查那個檔案或者類佔用地方比較大,可以使用這個工具
https://github.com/huanxsd/LinkMap(中文版的看看就知道怎麼使用)
7935076-efa39341f330ac34.png
image.png

相關文章