日常工作中檩奠,我們總會遇到一些反饋桩了,用戶稱頁面滑動不流暢偶爾還無響應(yīng),這個時候很多用戶在有其他更優(yōu)選擇的情況下埠戳,就不會繼續(xù)使用這個APP了井誉,所以卡頓對APP的傷害巨大,是必須要重點解決的問題整胃。
卡頓產(chǎn)生原因
在我們滑動頁面時颗圣,一般用60FPS來表示頁面的滑動流暢性,即每一秒鐘會有60幀的畫面更新屁使,即每隔16.7ms就要產(chǎn)生一幀畫面在岂,這樣才會看到流暢的效果;
我們看到流暢的顯示頁面蛮寂,是CPU與GPU協(xié)同合作的結(jié)果蔽午,CPU 負責計算顯示內(nèi)容,比如布局計算酬蹋、圖片解碼及老、文本繪制等操作。 CPU 將計算好的內(nèi)容交給GPU范抓,由 GPU 進行變換骄恶、合成、渲染匕垫。之后把渲染結(jié)果提交到幀緩沖區(qū)去叠蝇,等待下一次 VSync 信號到來時顯示到屏幕上。
在一個Vsync信號到來之前年缎,CPU與GPU的沒有共同完成下一畫面的合成工作,比如CPU加載時間過長铃慷,導致GPU來不及做合成渲染等工作单芜,那么這一幀內(nèi)容就會等待下一次機會顯示,這時候頁面就會停留于上一幀內(nèi)容犁柜,在用戶視覺上就會出現(xiàn)卡頓洲鸠。
滑動優(yōu)化方案
CPU
對象創(chuàng)建、調(diào)整、銷毀可以放到子線程中去
在子線程中對UI進行預(yù)排版扒腕,比如布局計算绢淀、文本計算等
對文本異步繪制、圖片編解碼等也要做預(yù)渲染
GPU
避免離屏渲染
減少過多視圖層級
離屏渲染
在當前屏幕緩沖區(qū)外瘾腰,GPU從新開辟一個緩沖區(qū)進行渲染操作皆的,當我們設(shè)置某些屬性,導致不能直接顯示時蹋盆,就會導致離屏渲染费薄,例如設(shè)置圓角屬性、蒙層遮罩等
觸發(fā)場景
1栖雾、圓角(makeToBounds 為 Yes時才會觸發(fā))
2楞抡、圖層蒙版
3、陰影
4析藕、光柵化
為何要避免
離屏渲染會創(chuàng)建新的渲染緩沖區(qū)召廷,內(nèi)存開銷會增大,會增加GPU的工作量账胧,導致CPU與GPU工作總耗時超過16.7ms竞慢,從而導致了UI的卡頓和掉幀現(xiàn)象。