iOS效能優化 Instrument 除錯介面卡頓

2021-07-29 15:25:57 字數 3280 閱讀 9194

工欲善其事,必先利其器。instrument對於ios開發來說,是發現並且解決問題的一把利器。

本文會用到的兩個工具包括:

ios裝置通常是60fps(每秒60幀),也就是說兩幀相隔的時間是1/60秒,大概16.7ms。在這16.7ms中,為了顯示一幀,需要如下工作

也就是說,cpu或者gpu被大量占用的時候,都有可能在16.7ms中沒辦法完成一幀的繪製,導致時鐘訊號到來的時候,取得還是上一幀的內容,也就都有可能導致介面卡頓

在ios中,渲染通常分為cpu和gpu渲染兩種,而gpu渲染又分為在gpu緩衝區和非gpu緩衝區兩種

通常,cpu渲染,和gpu非幀緩衝區內渲染統稱為離屏渲染。因為,cpu和幀緩衝區是為圖形影象顯示做了高度優化的,速度較快。

很少會,比如drawrect這個方法,只會在時圖進行重新繪製的時候才會呼叫。也就是說,假如你的view並不會頻繁重繪,那麼即使實現了drawrect,也沒什麼關係。

對了,目前ios裝置的硬體越來越好也是乙個原因,想要要效能差也挺難的。

上文提到了,coregraphics通常是cpu渲染成bitmap交給gpu,假如頻繁的大量的繪製出現,往往會導致介面卡頓。而calayer是對gpu做過優化的,能夠硬體加速。所以,對於效能要求較高的繪製,嘗試用calayer替代coregraphics

一定要在真機上測試效能才有意義,本文是採用iphone 5s來除錯的。一般測試效能支援的效能最差的就可以了,如果是ios 8要測試4s上的效能。

介面很簡單,乙個imageview,右側是隨機生成的100個字元,富文字顯示。

2.進入主介面,上下滾動list,讓time profile採集資料, 

勾選右側的

3.可以選擇一段時間,來分析這段時間cpu的使用情況 

4.找到占用時間最多的**

然後,雙擊占用最多的這一行,進入實際的**,看看到底**占用比較多

這裡,我們看到是這一行**cell.testlabel?.attributedtext = mutableattr。 

占用最多的cpu時間。

我們先來看下整個方法**,

乍一看,問題應該是這個隨機生成100個字元的函式啊

func calculaterandomtext()->string

return

result

}

因為,每一次cellforrow呼叫的時候,都會計算100次。然後,我們實際分析的時候,發現其實100次對顯示來說,真不算什麼,也不是卡頓的原因。

那麼,為什麼設定attributetext占用時間這麼多呢?

其實很簡單,attributetext是建立在textkit上的,由於每一次顯示都是隨機的attributetext,每一次都要重新計算文字的大小,位置等等。另外,uikit中,提供的文字渲染都是在cpu中進行的,渲染成bitmap,然後交給gpu,所以導致設定attributetext的時候,占用很多時間。

這裡不得不提到:一定不要過早優化,優化的時候盡量依賴於instrument的分析結果,而不是自己的主觀感受。尤其當你還是個新司機的時候。

在instrument中,command+l開啟library,然後新增core animation。我們來看看gpu的相關的問題

最直觀的就是滾動檢視,檢視fps(frame per second),一般小於50幀就會看到明顯的掉幀。

備註:這裡的很多參考自這本書

1.看看圖層混合情況

會看到截圖如下 

這裡的cell整個背景都是紅的,因為背景是alpha為0.3的view,uilabel是深紅色的,因為大量的陰影。

2.看看隔柵化情況,

截圖如下:

3.看看拷貝情況

我的測試專案裡沒有這個,所以不貼圖了。

4.看看有沒有畫素不對齊,有沒有拉伸和縮放

5.看看離屏渲染

-只開啟color offscreen-rendered yellow,離螢幕渲染的部分會被高亮成黃色

6.其他選項

介面頓卡主要從兩個角度考慮

cpu限制

gpu限制

使用facebook出品的asyncdisplaykit來寫複雜的介面。能夠獲得非同步繪製,預先載入等諸多好處。不過,需要一定的學習成本,前段時間看了下網易新聞的安裝包,就使用了asyncdisplaykit

把複雜的介面,放到後台執行緒裡繪製成乙個bitmap,然後再顯示。雖然有些延遲,不過換來的卻是平滑的介面。

建議使用成熟的庫,比如sdwebimage等,能夠在後台進行解碼,減少cpu的使用。

對於複雜的tableview,可以對cell檢視的各個控制項的大小,位置後台進行預計算,並且快取起來。這樣保證在heightforrowcellforrow中不進行大量的計算。

因為layer是乙個輕量級的檢視結構,它不接受通知,不接受觸控,不在響應鏈。所以,相對於uiview來說,它的效能較好。並且calayer及其子類是可以使用gpu渲染的,能夠硬體加速。

將兩個calayer的內容合成到乙個bitmap裡,然後顯示。能夠減輕gpu的壓力

建議看看這幾篇文章

效能優化 iOS

如果需要更詳細的資訊,那就將dyld print statistics details設定為1 2.1關於dyld 用machoview 檢視載入過程如上圖 備註1 如果設定了 dyld print libraries,或者選中run diagnostics 下面的 dynamic library ...

iOS效能優化 TableView

下面介紹一些我們可以自己設定的新能優化 1 盡量不透明的檢視 不透明檢視可以極大提高渲染的速度.因此如果可以,將 cell 及其子檢視的 opaque 屬性設定為 yes 預設值 cell 的 backgroundcolor 的 apha 值應為1 不要使用 clearcolor 影象的 apha ...

iOS 效能優化收集

ios 效能除錯 instrument instrument之core animation工具 避免圖層混合 確保控制項的opaque屬性設定為true,確保backgroundcolor和父檢視顏色一致且不透明 如無特殊需要,不要設定低於1的alpha值 確保uiimage沒有alpha通道 避免...