OC面試題目合集地址
建議先看下 IOS面試題(UIView) ----- 圖像顯示原理
問題1: 簡述下UI卡頓掉幀原因
首先我們要了解個概念, 人眼看到的基本滑動流暢性是60fps, 即每一秒中有60幀畫面更新。那么相當于每16.7ms要產(chǎn)生一幀畫面( 1 秒 = 1000 毫秒; 1 / 60 約等于 16.7ms )
那么在16.7ms內(nèi), CPU和GPU必須完成這1幀的數(shù)據(jù)

CPU花費一定時間處理文本布局, UI計算, 圖片解碼等, 完成之后把產(chǎn)生的位圖提交給GPU, GPU再做一些圖層合成, 紋理渲染提前準備好下一幀畫面, 那么在下一幀VSync信號(水平同步信號)到來時候, 就可以正常顯示

當CPU處理時間比較長, 而GPU還是處理完畢時候總時間可能會超過16.7ms, 下一個VSync信號來的時候, 我們沒有處理好這一幀內(nèi)容, 這樣就產(chǎn)生了掉幀的情況。用戶看到的效果就是卡頓。
問題2: 簡述下TableView / ScrollView滑動優(yōu)化有哪些方案 (防卡頓)
建議先看問題一
-
CPU: 中央處理器central processing unit方面
主要減輕CPU時長和壓力, 減少主線程壓力- 對象
創(chuàng)建,銷毀等放在子線程操作 -
預排版: UI 布局計算、文本計算等 放子線程 -
預渲染: 文本異步繪制, 圖片編碼
- 對象
-
GPU: 圖形處理器graphics processing unit方面-
紋理渲染:離屏渲染發(fā)生時候會使得GPU工作量變大時間變長, 盡量避免離屏渲染 -
視圖混合: 視圖層級復雜情況下(層層疊加情況下), GPU要做每個視圖的合成(合成像素點),GPU壓力會比較大??梢酝ㄟ^減少復雜層級減輕GPU壓力。
-
問題3: 什么是離屏渲染(通常問題二的追問)
先看概念
在屏渲染(On-Screen Rendering): 當前屏幕內(nèi)渲染,GPU的渲染是在當前用于顯示的屏幕緩沖區(qū)進行。離屏渲染(Off-Screen Rendering): 當前屏幕外渲染,GPU在當前屏幕緩沖區(qū)以外新開辟一個緩沖區(qū)進行渲染。
如果要在屏幕上顯示內(nèi)容, 至少需要一塊與屏幕像素數(shù)據(jù)量一樣大的幀緩沖區(qū)(FrameBuffer), 作為像素數(shù)據(jù)存儲區(qū)域, 之后由顯示控制區(qū)域把幀緩存區(qū)的數(shù)據(jù)顯示到屏幕. 如果GPU無法渲染直接寫入幀緩沖區(qū)(FrameBuffer), 例如 陰影, 圓角等, 暫時把臨時狀態(tài)放在額外的內(nèi)存區(qū)域做處理, 之后再寫入幀緩沖區(qū)(FrameBuffer), 這種情況被稱為 離屏渲染.
問題3追問: 為什么會有離屏渲染
有些效果被認為不能直接呈現(xiàn)于屏幕上,而需要在別的地方做額外的處理即預合成。圖層屬性的混合體沒有預合成之前, 不能直接在屏幕緩沖區(qū)中繪制, 所以就需要屏幕緩沖區(qū)外進行渲染。
舉個例子:
5個視圖a,b, c, d, e , 其中 c = d + e, 什么意思呢? c需要d和e渲染完成之后才能確定。 由于layer在GPU渲染是順序, 一層一層疊加, 那么就需要緩沖區(qū)額外開辟一塊內(nèi)存空間t, 令t = d + e, 再把 a + b + t 疊加渲染
問題3追問: 離屏渲染出現(xiàn)場景
圓角+maskToBounds = YES一起使用時候: 需要在layer及其子layer都渲染完成后,再計算圓角需要剪裁的內(nèi)容allowsGroupOpacity = YES+opacity < 1陰影: 需要先渲染出layer后,才能確定陰影。需要額外保存渲染layer后的狀態(tài),再渲染陰影圖層蒙版: 需要渲染出layer和子layer后才能確定mask內(nèi)容光柵化:shouldRasterize, 默認是NO, 當手動設(shè)為true的時候self.view.layer.shouldRasterize = true;, layer會被渲染成一個位圖bitmap, 把它保存起來, 下次直接使用不再渲染