亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

iOS性能優化淺析

2019-10-21 18:41:48
字體:
來源:轉載
供稿:網友

本文將從原理出發,解釋卡頓發生的原理,然后會講解項目中行之有效的幾個優化點,最后會展望一下接下來將要嘗試的方向。下面進入正題。

屏幕顯示的原理

iOS,性能優化

屏幕顯示原理

我們知道,遠古時代的CRT顯示器的顯示原理是用電子槍掃描熒光屏來發光。如上圖所示,電子槍按照從左到右,然后從上到下的順序掃描。當電子槍換到新的一行準備進行掃描時,也就是上圖A4、B4、C4、D4的位置,顯示器會發出一個水平同步信號;而當一幀畫面繪制完成后,電子槍回復到原位準備畫下一幀前,也就是上圖D4的位置,顯示器會發出一個垂直同步信號。垂直同步信號的作用一方面是通知顯示器回到A1位置,另外一方面,也通知顯卡,準備輸出下一幀畫面?,F在已經是液晶顯示器的時代了,不再使用電子槍掃描了,但是原理還是類似的,水平同步信號和垂直同步信號還是一樣被使用的。

iOS,性能優化

計算機工作原理

計算機系統的工作原理如上圖所示:首先是CPU的工作,包括創建視圖分配內存、計算布局、圖片解碼以及文本繪制等;接下來輪到GPU工作了,GPU負責視圖變換、合成和渲染等;GPU渲染完提交到幀緩沖區中,等收到垂直同步信號后將幀緩沖區的內容顯示到屏幕上。

屏幕撕裂(Screen tearing)

上述的簡單的屏幕顯示原理其實會產生這樣一個問題:假設我們的顯卡速度很快,每秒生產的幀數肯定要超過顯示器刷新率。那么在實際數據處理過程中,緩沖區的數據,在被輸出之前,就被顯卡不斷的刷新重寫。但是緩沖區并不是“先清空再寫入數據”,這太沒有效率,而是采用“新數據覆蓋老數據”的方式。

假設這樣一種情況,緩沖區已經有一副完整的幀畫面(A幀),然后顯卡生成了下一幀畫面(B幀),新一幀的數據開始寫入緩沖區,寫到一半的時候,垂直同步信號來 了,于是緩沖區的數據被輸出到顯示器。但問題是,這時緩沖區的數據,是由一半A幀和一半B幀數據合成的。因此最終顯示器上顯示出來的畫面就不是一副完整的 畫面,這就是“畫面撕裂”現象出現的原因(如下圖)。

iOS,性能優化

屏幕撕裂

那怎么才能解決畫面撕裂呢?簡單來說只要讓幀緩沖區里的數據始終保持一副完整的畫面就可以了。從技術角度出發,其實就是利用剛剛提到的垂直同步信號。

具體說起來就是,當顯卡生成了一副完整畫面并寫入了幀緩沖區之后,暫停!然后開始等待垂直同步信號,當得到垂直同步信號后,再繼續渲染下一幀寫入緩沖區。這樣就可以保證在緩沖區的數據始終是一副完整的畫面,不會出現前后幀混合的問題。

卡頓產生原因

但是呢,垂直同步帶來了一個新的問題—掉幀。所謂的掉幀,跟垂直同步有一定關系,因為垂直同步機制決定了如果在一個時鐘周期內CPU或者GPU沒有完成各自的任務的話,就會將幀緩沖區里的內容直接丟棄!掉幀并不能完全怪罪于垂直同步機制,更重要的原因是我們作為開發者沒有進行足夠的優化,將過重的任務派發到了CPU或者GPU上,下圖(from:iOS 保持界面流暢的技巧)是掉幀的圖示,表明CPU或者GPU任意一個沒能在時鐘周期內完成自己的任務的話都會導致卡頓掉幀。

iOS,性能優化

卡頓圖示

行之有效的優化點

提前布局

提前布局可以說是最重要的優化點了。其實在從服務端拿到 JSON 數據的時候,關于視圖的布局就已經確定了,包括每個控件的frame、cell的高度以及文本排版結果等等,在這個時候完全可以在后臺線程計算并封裝為對應的布局對象XXXTableViewCellLayout,每個cellLayout的內存占用并不是很多,所以直接全部緩存到內存中。當列表滾動到某個cell的時候,直接拿到對應的cellLayout配置這個cell的對應屬性即可。當然,該有的計算是免不了的,只是提前算好并緩存,免去了在滾動的時候計算和重復的計算。通過這一個優化,將本來的fps50的列表優化到了55、56左右,可以說從肉眼上已經看不出有卡頓掉幀了。

iOS,性能優化

cellLayout示例圖

上圖是項目中某個cellLayout的部分代碼,可以看到里面存的就是所有控件的frame和文本的排版結果而已,里面沒有任何的黑科技,只是將本來在滾動中才做的事情提前了而已。

按頁加載緩存

現狀分析:90%的APP有tableview,90%的tableview里有上拉刷新和下拉加載。以我司的項目ZAKER中的熱點新聞界面為例,簡單流程大概是這樣的:①應用啟動的時候會將磁盤中所有的新聞一次性讀取出來顯示到屏幕上; ②在每次下拉刷新和上拉加載的時候會將內存中所有新聞緩存到磁盤中,也即全量讀寫。這意味著大部分的新聞數據會反復寫入到磁盤中,這樣的寫入是冗余的,因為前面的這些新聞數據并沒有發生改變。

改進方案:所以優化的方法就是將這些列表數組進行分割,分割成一頁一頁,每次寫入的數據量很小,而且避免了冗余寫入的問題?,F在的流程變為:①啟動時只讀取第一批新聞顯示在屏幕中;②下拉刷新和上拉加載的時候只把當前服務器返回的一批新聞寫入緩存中;③在上拉加載的時候會先查看磁盤中是否有未讀的緩存,若有則讀取緩存,否則才從服務器下載一批新的文章。

直觀圖示:

iOS,性能優化

按頁緩存

可以看到,優化之前整個新聞列表以及其他配置都在一個文件里,刷新10幾次之后文件大小達到2MB,并且隨著不斷刷新而越來越大;優化之后,其他的配置還是在剛剛的文件中,但是不斷增長的新聞數組被分割成一頁一頁的文件,每一頁里面有10多條的新聞數據,同時有一個configure文件保存這些頁的信息以及頁的順序。根據測試人員的反饋,進行按頁加載緩存優化能減少5%~8%的CPU占用,使用的內存也有一定的下降。還是有很明顯的優化效果的。

后臺線程處理圖片

圓形頭像、圖片裁圓角等處理可以說是非常常見的需求了,包括從iOS11的系統各處都能看到,整體的頁面控件都變得更加圓潤了。但是,對圖片處理必然是消耗資源的,實現過圖片圓角效果的應該都知道,最簡單的就是 layer.cornerRadius+layer.masksToBounds 的方式,但是這種做法在tableview中往往會使滾動變得卡頓,因為這種實現方式會觸發離屏渲染,屏幕外緩沖區跟當前屏幕緩沖區上下文切換是很耗性能的,所以離屏渲染往往會造成卡頓(參考:iOS 離屏渲染的研究)。

那要怎么處理圖片呢?可以使用Core Graphics,Core Graphic通常是線程安全的,所以可以進行異步繪制,顯示的時候再放回主線程。我們在項目中實現了一個后臺處理圖片的框架,核心代碼如下:

NSBlockOperation *transformOperation = [[NSBlockOperation alloc] init];    [transformOperation addExecutionBlock:^{          // 此處處理圖片      ...      dispatch_async(dispatch_get_main_queue(), ^{          // 主線程設置圖片          [self setImage:transformedImage forState:UIControlStateNormal];        }      });    }];

更加高效的控件

還可以直接從開源庫中選用更加高效的控件替換項目中性能沒那么好的控件。項目中將之前的TTTAttributedLabel、M80AttributedLabel全部替換為YYLabel,開啟YYLabel的displaysAsynchronously、ignoreCommonProperties屬性可以異步繪制文本以及忽略不需要的屬性。更加追求性能的話,可以結合第1點的提前布局機制,在提前布局的階段生成好YYLabel渲染時用到的textLayout,顯示的時候直接賦值textLayout就可以了。

其他

還有一些比較微小的優化,對性能可以說沒有多大的影響,但是可以在開發階段稍加留意,養成良好的習慣。

盡量減少視圖層級,合并多余的視圖。同樣以 ZAKER 為例,用戶顯示時的藍V標簽、達人標簽以及樓主圖片等幾個視圖,之前是用不同的view來展示的,優化過程將這幾個view合并為一個view,一個view管理這些相似的事物,也可以減少某些相同邏輯的代碼。

減少頻繁的addSubview、removeSubview,remove之后視圖的實例對象會被釋放,再add的時候會再次調用初始化函數。替代方案的話,可以用hidden屬性隱藏不顯示的視圖。

異步繪制

從一開始接觸iOS的我們就反復被告知,UIKit的東西是絕對不能在后臺線程調用的,一定得在主線程調用,所以主線程也被叫做UI線程。在后臺線程調用UIKit的東西有一定幾率導致崩潰,或者出現視圖不顯示、顯示錯亂等等問題。但是呢,根據剛剛所說的,Core Graphics的那一套東西是線程安全的,所以可以通過Core Graphics在后臺將視圖渲染到一張圖片上,顯示的時候在主線程將這張圖片設置到相應位置上。Facebook著名的AsyncDisplayKit的核心實現應該也是基于這個原理,接下來的優化可以嘗試這個方案。

Metal

根據Apple官方說法,Metal框架被設計用來實現兩個目標: 3D 圖形渲染和并行計算。這兩者有很多共同點。它們都在數量龐大的數據上并行運行特殊的代碼,并可以在GPU上執行。目前正在研究學習階段,看項目中是否能利用Metal進行一定的優化。

APM?

Application Performance Management(APM):應用程序性能管理, 通過對應用的可靠性、穩定性等方面的監控,進而達到可以快速修復問題、提高用戶體驗的目的。目前比較有代表性的 APM 產品有:聽云、阿里百川、騰訊 bugly等,現在也在考慮自己研發一套APM系統,先從比較簡單的指標入手,先對卡頓和崩潰這兩個指標著手,做的順利的話再逐步擴展別的指標的檢測管理。


注:相關教程知識閱讀請移步到IOS開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本高清视频一区| 亚洲国产天堂久久综合网| 日韩精品高清在线观看| 92国产精品视频| 国产一区二区在线免费| 成人做爰www免费看视频网站| 91精品国产自产在线观看永久| 国产精品成人一区二区三区吃奶| 成人黄在线观看| 亚洲成人精品av| 97视频在线观看免费高清完整版在线观看| 国产在线视频欧美| 国产精品福利无圣光在线一区| 茄子视频成人在线| 国产精品视频一| 综合国产在线视频| 国模叶桐国产精品一区| 日韩精品在线观看视频| 国产日韩欧美电影在线观看| 亚洲自拍另类欧美丝袜| 亚洲午夜未删减在线观看| 亚洲人a成www在线影院| 国产精品爱久久久久久久| 久久91精品国产| 国产午夜精品一区二区三区| 日韩视频免费观看| 欧美成人免费一级人片100| 亚洲精品白浆高清久久久久久| 欧美激情性做爰免费视频| 色噜噜国产精品视频一区二区| 国产成人精品最新| 中文字幕精品www乱入免费视频| 91网在线免费观看| 欧美夫妻性生活视频| 国产a级全部精品| 国产亚洲视频中文字幕视频| 欧美性猛交丰臀xxxxx网站| 日韩高清不卡av| 中文字幕av一区二区| 国产精品一区二区三区毛片淫片| 欧美高清自拍一区| 欧美人与性动交a欧美精品| 中文字幕亚洲图片| 粉嫩av一区二区三区免费野| 91在线免费观看网站| 欧美激情亚洲综合一区| 国产成人精品在线视频| 欧美老妇交乱视频| 久久影院免费观看| 欧美性理论片在线观看片免费| 欧美成人午夜免费视在线看片| 国产精品91免费在线| 中文字幕在线看视频国产欧美| 亚洲精品国产福利| 97视频免费在线看| 国内揄拍国内精品| 日韩视频精品在线| 91免费精品国偷自产在线| 国产精品视频一区国模私拍| 日韩精品高清视频| 亚洲国产欧美在线成人app| 伊人亚洲福利一区二区三区| 欧美综合在线观看| 欧美成人性生活| 欧美裸体xxxx极品少妇| 亚洲丁香久久久| 国产精品九九九| 美女福利精品视频| 国产精品久久99久久| 91情侣偷在线精品国产| 久久久久日韩精品久久久男男| 国产极品精品在线观看| 北条麻妃一区二区三区中文字幕| 午夜精品久久久久久久久久久久| 国产精品第一区| 国产在线精品成人一区二区三区| 国产在线高清精品| 日韩成人av在线播放| 日本电影亚洲天堂| 亚洲欧美综合精品久久成人| 91av网站在线播放| 亚洲成人a级网| 欧美精品日韩www.p站| 亚洲一区二区免费在线| 国产网站欧美日韩免费精品在线观看| 欧美中文在线视频| 91久热免费在线视频| 亚洲欧美日韩成人| 午夜精品福利视频| 中文字幕精品一区久久久久| 精品国产一区二区三区久久狼黑人| 欧美高清无遮挡| 欧美日韩一区二区三区在线免费观看| 成人网在线免费看| 亚洲欧洲国产伦综合| 中文字幕在线观看亚洲| 成人网在线免费看| 性色av一区二区三区免费| 92版电视剧仙鹤神针在线观看| 国产成人精彩在线视频九色| 国产精品91在线| 国产一区视频在线| 国产精品欧美日韩久久| 一区二区成人精品| 成人黄色免费在线观看| 欧美超级乱淫片喷水| 国产精品www色诱视频| 欧美人交a欧美精品| 在线午夜精品自拍| 久久久免费电影| 91老司机精品视频| 97国产一区二区精品久久呦| 国产精品高潮视频| 岛国av在线不卡| 亚洲黄页网在线观看| 97人人做人人爱| 欧美久久精品午夜青青大伊人| xxxxxxxxx欧美| 亚洲a级在线观看| 欧美性生交大片免费| 国产自摸综合网| 97视频免费在线看| 亚洲人成网站色ww在线| 亚洲精品国偷自产在线99热| 欧美久久精品午夜青青大伊人| 日韩一区在线视频| 亚洲欧美一区二区三区久久| 国产精品网址在线| 精品国产一区二区三区久久久狼| 一区二区在线视频播放| 成人欧美一区二区三区黑人孕妇| 亚洲自拍偷拍福利| 欧美久久精品一级黑人c片| 国产精品9999| 日韩精品在线视频美女| 粉嫩老牛aⅴ一区二区三区| 青草青草久热精品视频在线网站| 日韩欧美成人精品| 91精品久久久久久久久久久久久| 欧美美女15p| 久久精品视频在线观看| 国产精品流白浆视频| 欧美一级片免费在线| 国产不卡av在线| 欧美精品video| 久久99亚洲精品| 日韩成人在线电影网| 91免费视频国产| 国产精品一区二区三区成人| 日韩精品视频在线观看网址| 91精品国产高清自在线| 日韩av在线免费播放| 欧美一区二区三区图| 久久久久久久av| 国产精品久久久久久久app| 国产亚洲xxx| 91精品国产自产在线| 中文字幕亚洲专区| 亚洲成年人在线| 大桥未久av一区二区三区| 亚洲黄在线观看| 欧美亚洲国产视频| 成人xvideos免费视频| 国产在线不卡精品|