androidUI卡頓原理分析及Vsync信號(hào)機(jī)制

一虫溜、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í)候才使用;

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市庭再,隨后出現(xiàn)的幾起案子拄轻,更是在濱河造成了極大的恐慌,老刑警劉巖恨搓,帶你破解...
    沈念sama閱讀 217,509評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件斧抱,死亡現(xiàn)場離奇詭異辉浦,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)宪郊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門懊亡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人速警,你說我怎么就攤上這事鸯两。” “怎么了鸠匀?”我有些...
    開封第一講書人閱讀 163,875評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵缀棍,是天一觀的道長机错。 經(jīng)常有香客問我,道長青瀑,這世上最難降的妖魔是什么萧诫? 我笑而不...
    開封第一講書人閱讀 58,441評(píng)論 1 293
  • 正文 為了忘掉前任帘饶,我火速辦了婚禮,結(jié)果婚禮上镀裤,老公的妹妹穿的比我還像新娘缴饭。我一直安慰自己,他們只是感情好担猛,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,488評(píng)論 6 392
  • 文/花漫 我一把揭開白布毁习。 她就那樣靜靜地躺著,像睡著了一般纺且。 火紅的嫁衣襯著肌膚如雪载碌。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,365評(píng)論 1 302
  • 那天,我揣著相機(jī)與錄音步咪,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛感凤,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播禽翼,決...
    沈念sama閱讀 40,190評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼闰挡,長吁一口氣:“原來是場噩夢啊……” “哼礁哄!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起花枫,我...
    開封第一講書人閱讀 39,062評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤掏膏,失蹤者是張志新(化名)和其女友劉穎馒疹,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,500評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,706評(píng)論 3 335
  • 正文 我和宋清朗相戀三年汉买,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了蛙粘。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,834評(píng)論 1 347
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖舔痕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情伯复,我是刑警寧澤耿眉,帶...
    沈念sama閱讀 35,559評(píng)論 5 345
  • 正文 年R本政府宣布鸣剪,位于F島的核電站,受9級(jí)特大地震影響筐骇,放射性物質(zhì)發(fā)生泄漏铛纬。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,167評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望擒悬。 院中可真熱鬧,春花似錦懂牧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至溺忧,卻和暖如春鲁森,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背歌溉。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評(píng)論 1 269
  • 我被黑心中介騙來泰國打工痛垛, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人匙头。 一個(gè)月前我還...
    沈念sama閱讀 47,958評(píng)論 2 370
  • 正文 我出身青樓蹂析,卻偏偏與公主長得像碟婆,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子蝙叛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,779評(píng)論 2 354