
標(biāo)題
一、UITableView相關(guān)
1.1、重用機(jī)制
代碼層

重用機(jī)制
重用示意圖

重用示意圖
1.2、數(shù)據(jù)源同步

資源競(jìng)爭(zhēng)
解決方案
-
并發(fā)訪問(wèn)、數(shù)據(jù)拷貝
并發(fā)方案 -
串行訪問(wèn)
串行方案
二、事件傳遞與視圖響應(yīng)鏈
見(jiàn)文章事件傳遞與視圖響應(yīng)鏈
三、圖像顯示原理

總體圖

分工
3.1、CPU工作

CPU工作
- Layout
UI布局、文本計(jì)算 - Display
繪制 - Prepare
圖片編解碼 - Commit
提交位圖
3.2、GPU渲染管線

GPU渲染管線
四、UI卡頓&掉幀
4.1、UI卡頓&掉幀的原因
問(wèn)題1:UI卡頓&掉幀的原因是什么?

UI卡頓&掉幀原因
解釋
- 頁(yè)面滑動(dòng)流暢性是60FPS,指的是1s有60楨的畫(huà)面更新,這樣人眼看到的就是流暢效果。所以1/60秒(
16.7ms)就會(huì)產(chǎn)生一幀畫(huà)面。 - 在這
16.7ms之內(nèi),需要CPU、GPU共同完成一幀的數(shù)據(jù)。 - 如果CPU + GPU處理時(shí)間 >
16.7ms,在下一個(gè)VSync信號(hào)到來(lái)之前,這一楨畫(huà)面還沒(méi)有準(zhǔn)備好,由此產(chǎn)生了掉幀,看到的效果就是卡頓。
總結(jié):在規(guī)定的16.7ms之內(nèi), 在下一個(gè)VSync信號(hào)到來(lái)之前,CPU、GPU并沒(méi)有完成畫(huà)面的合成,由此造成掉幀卡頓。
4.2、滑動(dòng)優(yōu)化方案
4.2.1、CPU

CPU
主要是將上面工作,全部放到
子線程中去做,節(jié)省CPU時(shí)間。
4.2.2、GPU

GPU
五、UI繪制原理&異步繪制
5.1、繪制原理步驟

繪制原理步驟
調(diào)用[UIVIew setNeedsDisplay]并沒(méi)有發(fā)生視圖的調(diào)用工作,而是在之后的某一時(shí)機(jī)發(fā)生,會(huì)在當(dāng)前
runloop即將結(jié)束的時(shí)候,才調(diào)用[CALayer dispaly]進(jìn)行圖形繪制。系統(tǒng)繪制流程
沒(méi)有重寫(xiě)displayLayer方法,就用系統(tǒng)繪制流程。異步繪制入口
只有重寫(xiě)了displayLayer方法,才會(huì)進(jìn)入異步繪制流程。
5.2、系統(tǒng)繪制流程

系統(tǒng)繪制流程
5.3、異步繪制

異步繪制
- 實(shí)現(xiàn)了
displayLayer方法,就可以進(jìn)行異步繪制。 - 代理負(fù)責(zé)生成
位圖。 - 將
位圖賦值給layer.contents。
異步繪制流程時(shí)序圖

時(shí)序圖
問(wèn)題2:什么是異步繪制?
見(jiàn)上圖解。
簡(jiǎn)單總結(jié):
- 程序中某View調(diào)用
[setNeedsDisplay]??[CALayer dispaly]??某View重寫(xiě)displayLayer方法 - 在
displayLayer中生成位圖,當(dāng)前方法在子線程中進(jìn)行。 - 在主隊(duì)列中,將
位圖賦值給layer.contents。
此時(shí),就完成了UI控件的異步繪制過(guò)程。
六、離屏渲染
6.1、概念

概念
問(wèn)題3:什么是離屏渲染?
- 當(dāng)我們指定了UI視圖的某些屬性,標(biāo)記為在
未預(yù)合成之前不能用于屏幕顯示的時(shí)候,就會(huì)觸發(fā)離屏渲染 。 -
離屏渲染的概念起源于GPU層面
GPU
問(wèn)題4:離屏渲染何時(shí)會(huì)觸發(fā)?

離屏渲染
問(wèn)題5:為何要避免離屏渲染?
在觸發(fā)離屏渲染的時(shí)候,會(huì)觸發(fā)GPU工作量。而增加了GPU的工作量,有可能導(dǎo)致CPU + GPU耗時(shí)超過(guò)16.7ms,從而導(dǎo)致卡頓。
七、UI面試圖總結(jié)
問(wèn)題6:系統(tǒng)的UI事件傳遞機(jī)制是怎樣的?
從事件傳遞流程回答,著重說(shuō)hitTest:withEvent:和pointInside:withEvent:。

傳遞機(jī)制
問(wèn)題7:使得UITableView滾動(dòng)更流暢的方案和思路有哪些?
-
CPU
CPU
主要是將上面工作,全部放到子線程中去做,節(jié)省CPU時(shí)間。 -
GPU
GPU
問(wèn)題8:UIView與CALayer之間的關(guān)系是怎樣的?
- CALayer為UIView提供顯示的內(nèi)容,只負(fù)責(zé)內(nèi)容顯示,不參與事件處理。
- UIView作為CALayer的代理,提供交互操作;負(fù)責(zé)處理觸摸事件,參與響應(yīng)鏈。


