IOS面試題(UIView) ----- 頁面卡頓掉幀相關(guān)

OC面試題目合集地址
建議先看下 IOS面試題(UIView) ----- 圖像顯示原理

問題1: 簡述下UI卡頓掉幀原因

首先我們要了解個概念, 人眼看到的基本滑動流暢性是60fps, 即每一秒中有60幀畫面更新。那么相當于每16.7ms要產(chǎn)生一幀畫面( 1 秒 = 1000 毫秒; 1 / 60 約等于 16.7ms )

那么在16.7ms內(nèi), CPUGPU必須完成這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需要de渲染完成之后才能確定。 由于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, 把它保存起來, 下次直接使用不再渲染



問題4: 怎么查看離屏渲染

iOS 模擬器查看離屏渲染

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

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

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