- CoreAnimation
- CoreGraphic
- OpenGL
- Quartz
1. 離屏渲染
離屏渲染,通常是在GPU中處理;
設(shè)置 CALayer.shouldRasterize 屬性將離屏渲染;shouldRasterize =true將layer緩存為bitmap,適合不變的圖像處理扯旷;
出現(xiàn)離屏渲染的情形有:
- Core Graphic 的使用 CPU
- 使用drawRect CPU
- CALayers 的 shouldRasterize 屬性為 YES
- CALayers 使用 masksToBounds 和 shadow
- Any text including Core Text
- UIViewGroupOpacity
離屏渲染offscreen會(huì)影響動(dòng)畫(huà)的性能,需要謹(jǐn)慎用之霸奕;
可以使用Instruments在真機(jī)上檢測(cè)UI的哪部分是離屏渲染轴咱,Core Animation監(jiān)測(cè)(設(shè)置 Color Offscreen-Rendered Yellow 選中);
2. 界面流暢技巧
參考:http://blog.ibireme.com/2015/11/12/smooth_user_interfaces_for_ios/
CPU & GPU
iOS設(shè)備視頻輸出采用雙緩沖區(qū)+垂直同步( V-Sync信號(hào))剪廉,來(lái)保證畫(huà)面的流暢與完整性娃循;
- 界面卡頓:
CPU處理圖像提交給GPU變換、合成和渲染斗蒋,然后提交緩沖顯示捌斧,CPU或GPU任何一個(gè)在一個(gè)vSync信號(hào)道來(lái)前沒(méi)有將完整內(nèi)容提交,都會(huì)造成一幀圖像無(wú)法輸出泉沾,界面還是顯示之前的圖像捞蚂,這就是界面卡頓的原因; - CPU消耗:
對(duì)象的創(chuàng)建跷究,可以對(duì)象可以復(fù)用姓迅,可放在一個(gè)緩存池中進(jìn)行復(fù)用;
當(dāng)視圖層次調(diào)整時(shí)俊马,UIView與CALayer之間會(huì)出現(xiàn)很多方法調(diào)用與通知丁存,應(yīng)該避免調(diào)整視圖層次、添加和移除視圖柴我;
大量的對(duì)象釋放解寝,放到后臺(tái)線(xiàn)程去執(zhí)行;
視圖布局是APP最常見(jiàn)消耗CPU的地方艘儒,可以后臺(tái)線(xiàn)程提前計(jì)算好布局并進(jìn)行緩存聋伦,可極大提高性能夫偶;
文本計(jì)算及渲染,可放到后臺(tái)線(xiàn)程嘉抓,使用CoreText繪制與緩存索守;
圖片繪制,放到后臺(tái)線(xiàn)程處理抑片; - GPU消耗:
文理渲染卵佛,短時(shí)間大量圖片顯示會(huì)導(dǎo)致GPU占用非常高而出現(xiàn)掉幀現(xiàn)象,所以要盡量減少短時(shí)間大量圖片的顯示敞斋,盡可能多張照片合成一張截汪;
視圖混合,減少視圖數(shù)量及層次植捎,在不透明的視圖里面標(biāo)準(zhǔn)opaque以避免無(wú)用的alpha通道合成衙解;
CALayer 的 border、圓角焰枢、陰影蚓峦、遮罩(mask),CASharpLayer 的矢量圖形顯示济锄,通常會(huì)觸發(fā)離屏渲染(offscreen rendering)暑椰,這些通常發(fā)生在GPU里;添加CALayer.shouldRasterize 屬性荐绝,但這會(huì)把原本離屏渲染的操作轉(zhuǎn)嫁到 CPU 上去一汽;
"ASDK(AsyncDisplayLink) 認(rèn)為,阻塞主線(xiàn)程的任務(wù)低滩,主要分為布局召夹、渲染及創(chuàng)建銷(xiāo)毀對(duì)象這三大類(lèi)。文本和布局的計(jì)算恕沫、渲染监憎、解碼、繪制都可以通過(guò)各種方式異步執(zhí)行婶溯,但 UIKit 和 Core Animation 相關(guān)操作必需在主線(xiàn)程進(jìn)行鲸阔。ASDK 的目標(biāo),就是盡量把這些任務(wù)從主線(xiàn)程挪走爬虱,而挪不走的隶债,就盡量?jī)?yōu)化性能。"
3. 自動(dòng)布局動(dòng)畫(huà)
需要用到 layoutIfNeeded來(lái)立馬刷新約束布局跑筝,不是等到下一個(gè)需要渲染的時(shí)候才刷新死讹;
使用Masonry:
mas_updateConstraints
參考:
https://robots.thoughtbot.com/designing-for-ios-graphics-performance
AsyncDisplayKit - facebook 保持界面流暢的庫(kù)
The End