一、UITableView相關(guān)
1.1妈橄、重用機(jī)制
代碼層
重用示意圖
1.2威始、數(shù)據(jù)源同步
解決方案
-
并發(fā)訪問鼻吮、數(shù)據(jù)拷貝
-
串行訪問
二、事件傳遞與視圖響應(yīng)鏈
三筹裕、圖像顯示原理
3.1醋闭、CPU工作
- Layout
UI布局
、文本計算
- Display
繪制
- Prepare
圖片編解碼
- Commit
提交位圖
3.2朝卒、GPU渲染管線
四目尖、UI卡頓&掉幀
4.1、UI卡頓&掉幀的原因
問題1:UI卡頓&掉幀的原因是什么扎运?
解釋
- 頁面滑動流暢性是60FPS瑟曲,指的是1s有60楨的畫面更新,這樣人眼看到的就是流暢效果豪治。所以1/60秒(
16.7ms
)就會產(chǎn)生一幀畫面洞拨。 - 在這
16.7ms
之內(nèi),需要CPU负拟、GPU共同完成一幀的數(shù)據(jù)烦衣。 - 如果CPU + GPU處理時間 >
16.7ms
,在下一個VSync信號到來之前,這一楨畫面還沒有
準(zhǔn)備好花吟,由此產(chǎn)生了掉幀
秸歧,看到的效果就是卡頓
。
總結(jié):
在規(guī)定的16.7ms
之內(nèi)衅澈, 在下一個VSync
信號到來之前键菱,CPU、GPU并沒有完成畫面的合成今布,由此造成掉幀卡頓经备。
4.2、滑動優(yōu)化方案
4.2.1部默、CPU
主要是將上面工作侵蒙,全部放到
子線程
中去做,節(jié)省CPU時間傅蹂。
4.2.2纷闺、GPU
五、UI繪制原理&異步繪制
5.1份蝴、繪制原理步驟
調(diào)用[UIVIew setNeedsDisplay]并沒有發(fā)生視圖的調(diào)用工作急但,而是在之后的某一時機(jī)發(fā)生,會在當(dāng)前
runloop
即將結(jié)束的時候搞乏,才調(diào)用[CALayer dispaly]
進(jìn)行圖形繪制波桩。系統(tǒng)繪制流程
沒有重寫displayLayer
方法,就用系統(tǒng)繪制流程请敦。異步繪制入口
只有重寫了displayLayer
方法镐躲,才會進(jìn)入異步繪制流程。
5.2侍筛、系統(tǒng)繪制流程
5.3萤皂、異步繪制
- 實(shí)現(xiàn)了
displayLayer
方法,就可以進(jìn)行異步繪制匣椰。 - 代理負(fù)責(zé)生成
位圖
裆熙。 - 將
位圖
賦值給layer.contents
。
異步繪制流程時序圖
問題2:什么是異步繪制禽笑?
見上圖解入录。
簡單總結(jié):
- 程序中某View調(diào)用
[setNeedsDisplay]
??[CALayer dispaly]??某View重寫displayLayer
方法 - 在
displayLayer
中生成位圖
,當(dāng)前方法在子線程
中進(jìn)行佳镜。 - 在主隊列中僚稿,將
位圖
賦值給layer.contents
。
此時蟀伸,就完成了UI控件的異步繪制過程蚀同。
六缅刽、離屏渲染
6.1、概念
問題3:什么是離屏渲染蠢络?
- 當(dāng)我們指定了UI視圖的某些屬性衰猛,標(biāo)記為在
未預(yù)合成
之前不能用于屏幕顯示的時候,就會觸發(fā)離屏渲染 刹孔。 -
離屏渲染的概念起源于GPU層面
問題4:離屏渲染何時會觸發(fā)啡省?
問題5:為何要避免離屏渲染?
在觸發(fā)離屏渲染的時候芦疏,會觸發(fā)GPU
工作量冕杠。而增加了GPU
的工作量微姊,有可能導(dǎo)致CPU + GPU
耗時超過16.7ms
酸茴,從而導(dǎo)致卡頓。
七兢交、UI面試圖總結(jié)
問題6:系統(tǒng)的UI事件傳遞機(jī)制是怎樣的薪捍?
從事件傳遞流程回答,著重說hitTest:withEvent:
和pointInside:withEvent:
配喳。
問題7:使得UITableView滾動更流暢的方案和思路有哪些酪穿?
-
CPU
主要是將上面工作,全部放到子線程
中去做晴裹,節(jié)省CPU時間被济。 -
GPU
問題8:UIView與CALayer之間的關(guān)系是怎樣的?
- CALayer為UIView提供顯示的內(nèi)容涧团,只負(fù)責(zé)內(nèi)容顯示只磷,不參與事件處理。
- UIView作為CALayer的代理泌绣,提供交互操作钮追;負(fù)責(zé)處理觸摸事件,參與響應(yīng)鏈阿迈。