一虫溜、UI卡頓定義?
1股缸、用戶角度:app操作界面刷新緩慢衡楞,響應(yīng)不及時(shí)敦姻;界面滑動(dòng)不夠流暢;?
2镰惦、系統(tǒng)角度:屏幕刷新幀率不穩(wěn)定,掉幀嚴(yán)重兑凿,無法保證每秒60幀茵瘾,導(dǎo)致屏幕畫面撕裂;?
二卓嫂、UI卡頓常見原因分析以及處理方案?
1聘殖、過度繪制:?
原因:界面布局設(shè)計(jì)不合理或者過于復(fù)雜導(dǎo)致系統(tǒng)無法在16毫秒內(nèi)完成渲染,view過度繪制導(dǎo)致CPU或者GPU負(fù)載過重奸腺,View頻繁觸發(fā)measure血久、layout操作突照,導(dǎo)致measure氧吐、layout累計(jì)耗時(shí)嚴(yán)重以及整個(gè)View錯(cuò)誤的頻繁重新渲染;?
方案:優(yōu)化界面布局筑舅,使界面布局視圖扁平化,去除不必要的背景顏色翠拣,減少透明色的使用;?
方案依據(jù)原理:盡量減少View在系統(tǒng)中measure蛮粮、layout然想、draw的累計(jì)時(shí)間;?
2变泄、UI線程的復(fù)雜運(yùn)算?
原因:UI主線程運(yùn)算耗時(shí)?
方案:減少UI線程中數(shù)據(jù)運(yùn)算杖刷,使用子線程處理耗時(shí)任務(wù)?
3滑燃、頻繁GC?
原因:(1)役听、內(nèi)存抖動(dòng)表窘;(2)、瞬間產(chǎn)生大量對(duì)象乐严,消耗內(nèi)存;?
方案:盡量避免在循環(huán)邏輯或者onDraw方法中頻繁創(chuàng)建新對(duì)象和使用局部變量捂敌;?
三既琴、android Vsync機(jī)制?
1甫恩、什么是Vsync ??
Vsync 是Vertical Synchronization(垂直同步)的縮寫,是一種在PC上很早就廣泛使用的技術(shù)奖慌,可以簡單的把它認(rèn)為是一種定時(shí)中斷松靡。而在Android 4.1(JB)中已經(jīng)開始引入VSync機(jī)制,用來同步渲染击困,讓AppUI和SurfaceFlinger可以按硬件產(chǎn)生的VSync節(jié)奏進(jìn)行工作广凸。?
2蛛枚、Android屏幕刷新過程?
Android系統(tǒng)每隔16ms發(fā)出VSYNC信號(hào)谅海,觸發(fā)對(duì)UI進(jìn)行渲染扭吁,屏幕的刷新過程是每一行從左到右(行刷新盲镶,水平刷新,Horizontal Scanning)枫吧,從上到下(屏幕刷新九杂,垂直刷新,Vertical Scanning)例隆。當(dāng)整個(gè)屏幕刷新完畢抢蚀,即一個(gè)垂直刷新周期完成镀层,會(huì)有短暫的空白期皿曲,此時(shí)發(fā)出 VSync 信號(hào)唱逢。所以谷饿,VSync 中的 V 指的是垂直刷新中的垂直-Vertical。?
3、沒有使用Vsync的情況?
可見vsync信號(hào)沒有提醒CPU/GPU工作的情況下,在第一個(gè)16ms之內(nèi)捧挺,一切正常闽烙。然而在第二個(gè)16ms之內(nèi)声搁,幾乎是在時(shí)間段的最后CPU才計(jì)算出了數(shù)據(jù)捕发,交給了Graphics Driver,導(dǎo)致GPU也是在第二段的末尾時(shí)間才進(jìn)行了繪制,整個(gè)動(dòng)作延后到了第三段內(nèi)檐涝。從而影響了下一個(gè)畫面的繪制法挨。這時(shí)會(huì)出現(xiàn)Jank(閃爍,可以理解為卡頓或者停頓)。這時(shí)候CPU和GPU可能被其他操作占用了荐糜,這就是卡頓出現(xiàn)的原因;?
4丛版、使用Vsync同步?
CPU/GPU接收vsync信號(hào)偏序,Vsync每16ms一次研儒,那么在每次發(fā)出Vsync命令時(shí),CPU都會(huì)進(jìn)行刷新的操作好芭。也就是在每個(gè)16ms的第一時(shí)間冲呢,CPU就會(huì)響應(yīng)Vsync的命令敬拓,來進(jìn)行數(shù)據(jù)刷新的動(dòng)作。CPU和GPU的刷新時(shí)間乘凸,和Display的FPS是一致的营勤。因?yàn)橹挥械桨l(fā)出Vsync命令的時(shí)候壹罚,CPU和GPU才會(huì)進(jìn)行刷新或顯示的動(dòng)作猖凛。CPU/GPU接收vsync信號(hào)提前準(zhǔn)備下一幀要顯示的內(nèi)容形病,所以能夠及時(shí)準(zhǔn)備好每一幀的數(shù)據(jù),保證畫面的流暢漠吻;?
5途乃、多級(jí)緩沖?
Android除了使用Vsync機(jī)制,還使用了多級(jí)緩沖的策略來優(yōu)化屏幕顯示,如雙重緩沖(A + B)猎塞,當(dāng)Display buffer A 數(shù)據(jù)時(shí),CPU/GPU就已經(jīng)在buffer B 中處理下一幀要顯示的數(shù)據(jù)了。?
可是倘屹,當(dāng)系統(tǒng)資源緊張性能降低時(shí)慢叨,導(dǎo)致GPU在處理某幀數(shù)據(jù)時(shí)太耗時(shí)拍谐,在Vsync信號(hào)到來時(shí),buffer B的數(shù)據(jù)還沒準(zhǔn)備好力穗,此時(shí)不得不顯示buffer A的數(shù)據(jù)气嫁,這樣導(dǎo)致后面CPU/GPU沒有新的buffer準(zhǔn)備數(shù)據(jù)够坐,空白時(shí)間無事可做,后面Jank頻出
因此采用三級(jí)緩沖來解決系統(tǒng)對(duì)性能不穩(wěn)定導(dǎo)致的卡頓
當(dāng)出現(xiàn)上面所述情況后,新增一個(gè)buffer C 可以減少CPU和GPU在Vsync同步間的空白間隙甲棍,此時(shí)CPU/GPU能夠利用buffer C 繼續(xù)工作,后面buffer A 和 buffer B 依次處理下一幀數(shù)據(jù)七扰。這樣僅是產(chǎn)生了一個(gè)Jank颈走,可以忽略不計(jì),以后的流程就順暢了。?
注:在多數(shù)正常情況下還是使用二級(jí)緩沖機(jī)制序厉,三級(jí)緩沖只是在需要的時(shí)候才使用;