注意:本文主講UI相關(guān)面試問題,包括UITableView相關(guān)、事件傳遞&視圖相應(yīng)、圖像顯示原理、卡頓&掉幀、繪制原理&異步繪制、離屏渲染。
一、UITableView相關(guān)
1、重用機(jī)制


2、數(shù)據(jù)源同步
(1)、數(shù)據(jù)源同步問題

(2)、數(shù)據(jù)源同步解決方案
1>、并發(fā)訪問、數(shù)據(jù)拷貝

2>、串行訪問

二、事件傳遞&視圖相應(yīng)
1、UIView和CALayer的關(guān)系
UIView為其提供內(nèi)容,以及負(fù)責(zé)處理觸摸等事件,參與響應(yīng)鏈。
CALayer負(fù)責(zé)顯示內(nèi)容contents

三、圖像顯示原理


1、CPU工作
Layout(UI布局、文本計(jì)算); Display(繪制,drawRect方法);Prepare(圖片編解碼); Commit(提交位圖)。
2、GPU渲染管線(openGL)
頂點(diǎn)著色、圖元裝配、光柵化、片段著色、片段處理。
四、卡頓&掉幀
1、原因

2、優(yōu)化方案
(1)、CPU
對象創(chuàng)建、調(diào)整、銷毀;
預(yù)排版(布局計(jì)算、文本計(jì)算);
預(yù)渲染(文本等異步繪制,圖片編解碼等)。
(2)、GPU
紋理渲染(離屏渲染);
視圖混合(視圖層級復(fù)雜度,GPU需要做每個視圖的合成)。
五、繪制原理&異步繪制

一、系統(tǒng)繪制流程

二、異步繪制
-[layer.delegate displayLayer:]
代理負(fù)責(zé)生成對應(yīng)的bitmap
設(shè)置該bitmap作為layer.contents屬性的值

六、離屏渲染
1、啥是離屏渲染?
當(dāng)設(shè)置某一些UI視圖的圖層屬性時,如果未被預(yù)合成之前不能用于當(dāng)前屏幕直接顯示的時候,就會觸發(fā)離屏渲染。而離屏渲染的概念起源于GPU層面,指的是GPU在當(dāng)前屏幕緩沖區(qū)以外新開辟一個緩沖區(qū)進(jìn)行渲染操作。
當(dāng)屏渲染:指的是GPU的渲染操作是在當(dāng)前用于顯示的屏幕緩存區(qū)中進(jìn)行。
2、何時會觸發(fā)?
(1)、圓角(當(dāng)和maskToBounds一起使用時)
(2)、圖層蒙版
(3)、陰影
(4)、光柵化
3、為何要避免?
(1)、會增加GPU的工作量,會導(dǎo)致CPU和GPU的工作總耗時超過16.7毫秒,會導(dǎo)致UI的卡頓和掉幀。
(2)、創(chuàng)建新的渲染緩沖區(qū),會內(nèi)存開銷。
(3)、上下文切換,會導(dǎo)致GPU額外開銷。
最后總結(jié)點(diǎn)東西吧,面試官經(jīng)常問的問題有:
1、系統(tǒng)的UI事件傳遞機(jī)制是咋樣的?
2、使UITableView滾動更流暢的方案或思路都有哪些?
3、什么是離屏渲染?
4、UIView和CALayer之間的關(guān)系是咋樣的?