Android UI性能優(yōu)化——理論篇

概述

Android 從一誕生到現(xiàn)在已經(jīng)發(fā)布的 7.0 版本践宴,卡頓和不流暢問(wèn)題卻一直被人們所詬病哨查≡赡遥客觀地來(lái)講弦疮,Android 的流暢性確實(shí)一直不給力,哪怕是某些大廠的 App 蜘醋,也都不同程度地存在卡頓問(wèn)題胁塞。從開發(fā)角度來(lái)說(shuō),每個(gè)開發(fā)者都應(yīng)該關(guān)注下性能優(yōu)化堂湖,在平時(shí)的開發(fā)工作中注意一些細(xì)節(jié)闲先,盡可能地去優(yōu)化應(yīng)用。

在 Android 開發(fā)中无蜂,UI 可以說(shuō)是每個(gè) App 使用頻率很高的伺糠,隨著 UI 越來(lái)越多,布局的重復(fù)性斥季、復(fù)雜度也會(huì)隨之增長(zhǎng)训桶,UI 設(shè)計(jì)或者布局不慎,就會(huì)引起過(guò)度繪制或者造成 UI 卡頓的情況酣倾,這樣使得 UI 性能的優(yōu)化舵揭,顯得至關(guān)重要,UI 的質(zhì)量也是產(chǎn)品質(zhì)量的一部分躁锡。

2015年初午绳,Google 發(fā)布了關(guān)于 Android 性能優(yōu)化典范的專題,一共16個(gè)短視頻映之,每個(gè)3-5分鐘拦焚,幫助開發(fā)者創(chuàng)建更快更優(yōu)秀的 Android App蜡坊。課程專題不僅僅介紹了 Android 系統(tǒng)中有關(guān)性能問(wèn)題的底層工作原理,同時(shí)也介紹了如何通過(guò)工具來(lái)找出性能問(wèn)題以及提升性能的建議赎败。今天我們就其中之一 Android 渲染機(jī)制開始講起秕衙。

Android渲染機(jī)制

渲染性能

大多數(shù)用戶感知到的卡頓等性能問(wèn)題的最主要根源都是因?yàn)殇秩拘阅堋脑O(shè)計(jì)師的角度僵刮,他們希望 App 能夠有更多的動(dòng)畫据忘,圖片等時(shí)尚元素來(lái)實(shí)現(xiàn)流暢的用 戶體驗(yàn)。但是 Android 系統(tǒng)很有可能無(wú)法及時(shí)完成那些復(fù)雜的界面渲染操作搞糕。Android 系統(tǒng)每隔16ms發(fā)出 VSYNC 信號(hào)勇吊,觸發(fā)對(duì) UI 進(jìn)行渲染, 如果每次渲染都成功窍仰,這樣就能夠達(dá)到流暢的畫面所需要的60fps萧福,為了能夠?qū)崿F(xiàn)60fps,這意味著程序的大多數(shù)操作都必須在16ms內(nèi)完成辈赋。

<img src="http://upload-images.jianshu.io/upload_images/2153668-540bd95044067551.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" />

如果你的某個(gè)操作花費(fèi)時(shí)間是24ms,系統(tǒng)在得到VSYNC信號(hào)的時(shí)候就無(wú)法進(jìn)行正常渲染膏燕,這樣就發(fā)生了丟幀現(xiàn)象钥屈。那么用戶在32ms內(nèi)看到的會(huì)是同一幀畫面。

<img src="http://upload-images.jianshu.io/upload_images/2153668-64ce9db72b29bc61.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" />

用戶容易在 UI 執(zhí)行動(dòng)畫或者滑動(dòng) ListView 的時(shí)候感知到卡頓不流暢坝辫,是因?yàn)檫@里的操作相對(duì)復(fù)雜篷就,容易發(fā)生丟幀的現(xiàn)象,從而感覺(jué)卡頓近忙。有很多原 因可以導(dǎo)致丟幀竭业,也許是因?yàn)槟愕?layout 太過(guò)復(fù)雜,無(wú)法在16ms內(nèi)完成渲染及舍,有可能是因?yàn)槟愕?UI 上有層疊太多的繪制單元未辆,還有可能是因?yàn)閯?dòng)畫執(zhí)行的次數(shù)過(guò)多。這些都會(huì)導(dǎo)致CPU或者GPU負(fù)載過(guò)重锯玛。

渲染組件

對(duì)于上面提到的 CUP 和 GPU咐柜,就需要我們了解 Android 的渲染機(jī)制,Android 的渲染主要分為兩個(gè)組件:

  • CPU
  • GPU

他們主要的工作是:

<img src="http://upload-images.jianshu.io/upload_images/2153668-127c14718ee29fca.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240" />

渲染操作通常依賴于兩個(gè)核心組件:CPU 與 GPU攘残。CPU負(fù)責(zé)包括 Measure拙友,Layout,Record歼郭,Execute 的計(jì)算操作遗契,把 UI 組件計(jì)算成Polygons,Texture紋理病曾,然后交給GPU進(jìn)行柵格化渲染牍蜂。漾根。CPU 通常存在的問(wèn)題的原因是存在非必需的視圖組件,它不僅僅會(huì)帶來(lái)重復(fù)的計(jì)算操作捷兰,而且還會(huì)占用額外的 GPU 資源立叛;GPU 通常存在的問(wèn)題的原因是存在過(guò)度繪制。

Activity 如何將復(fù)雜的UI轉(zhuǎn)換成用戶看得懂的圖像并繪制到屏幕上贡茅?

這是由格柵化操作完成的秘蛇,所謂的柵格化就是繪制那些 Button,Shape顶考,Path赁还,String,Bitmap 等組件最基礎(chǔ)的操作驹沿。它把那些組件拆分到不同的像素上進(jìn)行顯示艘策,說(shuō)的俗氣一點(diǎn),就是解決那些復(fù)雜的 XML 布局文件和標(biāo)記語(yǔ)言渊季,使之轉(zhuǎn)化成用戶能看懂的圖像朋蔫,但是這不是直接轉(zhuǎn)換的,XML 布局文件需要在 CPU 中首先轉(zhuǎn)換為多邊形或者紋理却汉,然后再傳遞給 GPU 進(jìn)行柵格化驯妄。

說(shuō)完了概念,繼續(xù)分析上圖合砂,如何對(duì) CPU 和 GPU 進(jìn)行優(yōu)化呢青扔?

  • 通過(guò)Hierarchy Viewer去檢測(cè)渲染效率,去除不必要的嵌套翩伪;
  • 通過(guò)Show GPU Overdraw去檢測(cè)Overdraw微猖,最終可以通過(guò)移除不必要的背景以及使用canvas.clipRect解決大多數(shù)問(wèn)題。

到這里缘屹,你可能對(duì) UI 優(yōu)化還是不太理解凛剥,畢竟概念是枯燥的,下面我們就深入研究?jī)?yōu)化轻姿。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末当悔,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子踢代,更是在濱河造成了極大的恐慌盲憎,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,525評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件胳挎,死亡現(xiàn)場(chǎng)離奇詭異饼疙,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,203評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門窑眯,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)屏积,“玉大人,你說(shuō)我怎么就攤上這事磅甩〈读郑” “怎么了?”我有些...
    開封第一講書人閱讀 164,862評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵卷要,是天一觀的道長(zhǎng)渣聚。 經(jīng)常有香客問(wèn)我,道長(zhǎng)僧叉,這世上最難降的妖魔是什么奕枝? 我笑而不...
    開封第一講書人閱讀 58,728評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮瓶堕,結(jié)果婚禮上隘道,老公的妹妹穿的比我還像新娘。我一直安慰自己郎笆,他們只是感情好谭梗,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,743評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著宛蚓,像睡著了一般默辨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上苍息,一...
    開封第一講書人閱讀 51,590評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音壹置,去河邊找鬼竞思。 笑死,一個(gè)胖子當(dāng)著我的面吹牛钞护,可吹牛的內(nèi)容都是我干的盖喷。 我是一名探鬼主播,決...
    沈念sama閱讀 40,330評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼难咕,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼课梳!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起余佃,我...
    開封第一講書人閱讀 39,244評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤暮刃,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后爆土,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體椭懊,經(jīng)...
    沈念sama閱讀 45,693評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,885評(píng)論 3 336
  • 正文 我和宋清朗相戀三年步势,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了氧猬。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片背犯。...
    茶點(diǎn)故事閱讀 40,001評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖盅抚,靈堂內(nèi)的尸體忽然破棺而出漠魏,到底是詐尸還是另有隱情,我是刑警寧澤妄均,帶...
    沈念sama閱讀 35,723評(píng)論 5 346
  • 正文 年R本政府宣布柱锹,位于F島的核電站,受9級(jí)特大地震影響丛晦,放射性物質(zhì)發(fā)生泄漏奕纫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,343評(píng)論 3 330
  • 文/蒙蒙 一烫沙、第九天 我趴在偏房一處隱蔽的房頂上張望匹层。 院中可真熱鬧,春花似錦锌蓄、人聲如沸升筏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,919評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)您访。三九已至,卻和暖如春剪决,著一層夾襖步出監(jiān)牢的瞬間灵汪,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,042評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工柑潦, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留享言,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,191評(píng)論 3 370
  • 正文 我出身青樓渗鬼,卻偏偏與公主長(zhǎng)得像览露,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子譬胎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,955評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容