iOS性能優(yōu)化

在性能優(yōu)化中一個最具參考價值的屬性是FPS:Frames Per Second,其實就是屏幕刷新率绪杏,蘋果的iphone推薦的刷新率是60Hz长踊,也就是說GPU每秒鐘刷新屏幕60次择葡,這每刷新一次就是一幀frame昭灵,F(xiàn)PS也就是每秒鐘刷新多少幀畫面姓蜂。靜止不變的頁面FPS值是0挥唠,這個值是沒有參考意義的滔吠,只有當頁面在執(zhí)行動畫或者滑動的時候纲菌,F(xiàn)PS值才具有參考價值,F(xiàn)PS值的大小體現(xiàn)了頁面的流暢程度高低疮绷,當?shù)陀?5的時候卡頓會比較明顯翰舌。

圖層混合:

每一個layer是一個紋理,所有的紋理都以某種方式堆疊在彼此的頂部冬骚。對于屏幕上的每一個像素椅贱,GPU需要算出怎么混合這些紋理來得到像素RGB的值懂算。

當Sa = 0.5時,RGB值為(0.5, 0, 0)庇麦,可以看出计技,當兩個不是完全不透明的CALayer覆蓋在一起時,GPU大量做這種復合操作,隨著這中操作的越多山橄,GPU越忙碌垮媒,性能肯定會受到影響。

公式:

R = S + D * ( 1 – Sa )

結果的顏色是源色彩(頂端紋理)+目標顏色(低一層的紋理)*(1-源顏色的透明度)航棱。

當Sa = 1時睡雇,R = S,GPU將不會做任何合成,而是簡單從這個層拷貝饮醇,不需要考慮它下方的任何東西(因為都被它遮擋住了)它抱,這節(jié)省了GPU相當大的工作量。

怎么檢測圖層混合:

1驳阎、模擬器debug- 選中 color blended layers紅色區(qū)域表示圖層發(fā)生了混合

2抗愁、Instrument-選中Core Animation-勾選Color Blended Layers

避免圖層混合:

1馁蒂、確焙峭恚控件的opaque屬性設置為true,確保backgroundColor和父視圖顏色一致且不透明

2沫屡、如無特殊需要饵隙,不要設置低于1的alpha值

3、確保UIImage沒有alpha通道

UILabel圖層混合解決方法:

iOS8以后設置背景色為非透明色并且設置label.layer.masksToBounds=YES讓label只會渲染她的實際size區(qū)域沮脖,就能解決UILabel的圖層混合問題

iOS8 之前只要設置背景色為非透明的就行

為什么設置了背景色但是在iOS8上仍然出現(xiàn)了圖層混合呢金矛?

UILabel在iOS8前后的變化,在iOS8以前勺届,UILabel使用的是CALayer作為底圖層驶俊,而在iOS8開始,UILabel的底圖層變成了_UILabelLayer免姿,繪制文本也有所改變饼酿。在背景色的四周多了一圈透明的邊,而這一圈透明的邊明顯超出了圖層的矩形區(qū)域設置圖層的masksToBounds為YES時胚膊,圖層將會沿著Bounds進行裁剪 圖層混合問題解決了

iOS離屏渲染

怎么檢測離屏渲染:

1故俐、模擬器debug-選中color Offscreen - Renderd離屏渲染的圖層高亮成黃 可能存在性能問題

2、真機Instrument-選中Core Animation-勾選Color Offscreen-Rendered Yellow

離屏渲染的觸發(fā)方式

設置了以下屬性時紊婉,都會觸發(fā)離屏繪制:

1药版、layer.shouldRasterize(光柵化)

光柵化概念:將圖轉化為一個個柵格組成的圖象。

光柵化特點:每個元素對應幀緩沖區(qū)中的一像素喻犁。

2槽片、masks(遮罩)

3何缓、shadows(陰影)

4、edge antialiasing(抗鋸齒)

5筐乳、group opacity(不透明)

6歌殃、復雜形狀設置圓角等

7、漸變

8蝙云、drawRect

例如我們日程經常打交道的TableViewCell,因為TableViewCell的重繪是很頻繁的(因為Cell的復用),如果Cell的內容不斷變化,則Cell需要不斷重繪,如果此時設置了cell.layer可光柵化氓皱。則會造成大量的離屏渲染,降低圖形性能。

如果將不在GPU的當前屏幕緩沖區(qū)中進行的渲染都稱為離屏渲染勃刨,那么就還有另一種特殊的“離屏渲染”方式:CPU渲染波材。如果我們重寫了drawRect方法,并且使用任何Core Graphics的技術進行了繪制操作身隐,就涉及到了CPU渲染廷区。整個渲染過程由CPU在App內同步地完成,渲染得到的bitmap最后再交由GPU用于顯示贾铝。

現(xiàn)在擺在我們面前得有三個選擇:當前屏幕渲染隙轻、離屏渲染、CPU渲染垢揩,該用哪個呢玖绿?這需要根據(jù)具體的使用場景來決定。

盡量使用當前屏幕渲染

鑒于離屏渲染叁巨、CPU渲染可能帶來的性能問題斑匪,一般情況下,我們要盡量使用當前屏幕渲染锋勺。

離屏渲染 VS CPU渲染

由于GPU的浮點運算能力比CPU強蚀瘸,CPU渲染的效率可能不如離屏渲染;但如果僅僅是實現(xiàn)一個簡單的效果庶橱,直接使用CPU渲染的效率又可能比離屏渲染好贮勃,畢竟離屏渲染要涉及到緩沖區(qū)創(chuàng)建和上下文切換等耗時操作

UIButton 的 masksToBounds = YES又設置setImage、setBackgroundImage苏章、[button setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"btn_selected"]]];

下發(fā)生離屏渲染寂嘉,但是[button setBackgroundColor:[UIColor redColor]];是不會出現(xiàn)離屏渲染的

關于 UIImageView,現(xiàn)在測試發(fā)現(xiàn)(現(xiàn)版本: iOS10),在性能的范圍之內,給UIImageView設置圓角是不會觸發(fā)離屏渲染的,但是同時給UIImageView設置背景色則肯定會觸發(fā).觸發(fā)離屏渲染跟 png.jpg格式并無關聯(lián)

日常我們使用layer的兩個屬性,實現(xiàn)圓角

imageView.layer.cornerRaidus = CGFloat(10);

imageView.layer.masksToBounds = YES;

這樣處理的渲染機制是GPU在當前屏幕緩沖區(qū)外新開辟一個渲染緩沖區(qū)進行工作布近,也就是離屏渲染垫释,這會給我們帶來額外的性能損耗。如果這樣的圓角操作達到一定數(shù)量撑瞧,會觸發(fā)緩沖區(qū)的頻繁合并和上下文的的頻繁切換棵譬,性能的代價會宏觀地表現(xiàn)在用戶體驗上——掉幀

光柵化

光柵化是將幾何數(shù)據(jù)經過一系列變換后最終轉換為像素,從而呈現(xiàn)在顯示設備上的過程预伺,光柵化的本質是坐標變換订咸、幾何離散化

我們使用 UITableView 和 UICollectionView 時經常會遇到各個 Cell 的樣式是一樣的曼尊,這時候我們可以使用這個屬性提高性能:

cell.layer.shouldRasterize=YES;

cell.layer.rasterizationScale=[[UIScreenmainScreen]scale];

頁面間跳轉的性能優(yōu)化:

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市脏嚷,隨后出現(xiàn)的幾起案子骆撇,更是在濱河造成了極大的恐慌,老刑警劉巖父叙,帶你破解...
    沈念sama閱讀 219,270評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件神郊,死亡現(xiàn)場離奇詭異,居然都是意外死亡趾唱,警方通過查閱死者的電腦和手機涌乳,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來甜癞,“玉大人夕晓,你說我怎么就攤上這事∮圃郏” “怎么了蒸辆?”我有些...
    開封第一講書人閱讀 165,630評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長析既。 經常有香客問我躬贡,道長,這世上最難降的妖魔是什么渡贾? 我笑而不...
    開封第一講書人閱讀 58,906評論 1 295
  • 正文 為了忘掉前任逗宜,我火速辦了婚禮雄右,結果婚禮上空骚,老公的妹妹穿的比我還像新娘。我一直安慰自己擂仍,他們只是感情好囤屹,可當我...
    茶點故事閱讀 67,928評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著逢渔,像睡著了一般肋坚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上肃廓,一...
    開封第一講書人閱讀 51,718評論 1 305
  • 那天智厌,我揣著相機與錄音,去河邊找鬼盲赊。 笑死铣鹏,一個胖子當著我的面吹牛,可吹牛的內容都是我干的哀蘑。 我是一名探鬼主播诚卸,決...
    沈念sama閱讀 40,442評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼葵第,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了合溺?” 一聲冷哼從身側響起卒密,我...
    開封第一講書人閱讀 39,345評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎棠赛,沒想到半個月后哮奇,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 45,802評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡睛约,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,984評論 3 337
  • 正文 我和宋清朗相戀三年屏镊,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痰腮。...
    茶點故事閱讀 40,117評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡而芥,死狀恐怖,靈堂內的尸體忽然破棺而出膀值,到底是詐尸還是另有隱情棍丐,我是刑警寧澤,帶...
    沈念sama閱讀 35,810評論 5 346
  • 正文 年R本政府宣布沧踏,位于F島的核電站歌逢,受9級特大地震影響,放射性物質發(fā)生泄漏翘狱。R本人自食惡果不足惜秘案,卻給世界環(huán)境...
    茶點故事閱讀 41,462評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望潦匈。 院中可真熱鬧阱高,春花似錦、人聲如沸茬缩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽凰锡。三九已至未舟,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間掂为,已是汗流浹背裕膀。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留勇哗,地道東北人昼扛。 一個月前我還...
    沈念sama閱讀 48,377評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像智绸,于是被迫代替她去往敵國和親野揪。 傳聞我的和親對象是個殘疾皇子访忿,可洞房花燭夜當晚...
    茶點故事閱讀 45,060評論 2 355

推薦閱讀更多精彩內容