UI相關(guān)知識(shí)

標(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)鏈。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容