Android 性能優(yōu)化: Render + Hierarchy-viewer工具

Android 什么情況下會(huì)出現(xiàn)卡頓現(xiàn)象:


丟幀.png

android 繪制的機(jī)制是每60幀(16ms)繪制一次;
正常來講程序要在update的時(shí)間里面做好繪制前的準(zhǔn)備筛谚,而且這個(gè)準(zhǔn)備時(shí)間不能超過16ms,這樣就不會(huì)有卡頓的現(xiàn)象粗恢,
如果update 的時(shí)間超過了16ms ,比如圖中的24ms, 那么在這次繪制過程中甩栈,原本到了16ms時(shí)铅檩,系統(tǒng)要執(zhí)行繪制,但是發(fā)現(xiàn)程序運(yùn)行過慢疹尾,導(dǎo)致這一幀的繪制準(zhǔn)備工作沒執(zhí)行完秘豹,那么這次繪制就執(zhí)行不了,導(dǎo)致丟幀诱咏;

Android 渲染的兩大組件 CPU + GPU苔可,如下圖所示:
CPU 負(fù)責(zé)測(cè)量,布局袋狞,記錄焚辅,執(zhí)行
GPU 負(fù)責(zé)將CPU傳遞過來的view 柵格化并存儲(chǔ);

image.png

下圖總結(jié)性的展示的了CPU GPU的問題苟鸯,已經(jīng)解決工具法焰;
總結(jié)來說:

* 1:flatten hierarchy ,xml采用扁平化的設(shè)計(jì)倔毙;比如減少LinearLayout的使用埃仪,使用RelativeLayout 減少層級(jí)深度,在或者使用約束布局陕赃;
* 2:cliprect 卵蛉,在繪制邏輯中使用正確的API ,盡量繪制要顯示的部分颁股,而不去繪制那些被覆蓋無(wú)需顯示的部分;
* 3:remove background, 在xml中傻丝,或者在代碼(手?jǐn)]顯示邏輯)邏輯中移除不需要的背景甘有;
解決View Render problem.png

Android Render 優(yōu)化原理

image.png

Android 界面展示的原理大概是,CPU 獲取到要顯示的內(nèi)容葡缰,比如圖片亏掀,文字,在CPU 內(nèi)部提前做一部分柵格化的工作泛释,這個(gè)操作是耗時(shí)的滤愕,如下圖上面的沙漏任務(wù);當(dāng)CPU執(zhí)行完這部分工作之后就會(huì)把任務(wù)提交給GPU去做真正的柵格化怜校,這個(gè)任務(wù)也是相當(dāng)耗時(shí)的间影,然后在屏幕上的每一個(gè)像素點(diǎn),顯示對(duì)應(yīng)的顏色茄茁,來完成圖像的顯示魂贬。

image.png

因?yàn)镃PU,GPU 執(zhí)行的兩個(gè)任務(wù)都是耗時(shí)任務(wù),所以想要優(yōu)化的話裙顽,就是想辦法減輕這兩個(gè)任務(wù)的工作量付燥;

這里結(jié)合上面總結(jié)出來的解決方法來說明;

減輕CPU的工作量愈犹,就對(duì)應(yīng)的總結(jié) 1:

扁平化設(shè)計(jì) XML 布局机蔗,讓布局的層級(jí)深度不那么高,可以減輕CPU的任務(wù)量甘萧;

減輕GPU的工作量,就對(duì)應(yīng)的總結(jié) 2梆掸、3:

只繪制需要展示的部分扬卷,以及移除多余的背景,目的就是解決overview(重復(fù)繪制) 的情況出現(xiàn)酸钦,overview 的出現(xiàn)是一次繪制過程中怪得,在同一個(gè)像素點(diǎn)上進(jìn)行了多次繪制,被覆蓋的繪制完全是多余的卑硫;

問題一:GPU 問題 OverDraw

OverDraw出現(xiàn)是一次繪制過程中徒恋,在同一個(gè)像素點(diǎn)上進(jìn)行了多次繪制,被覆蓋的繪制完全是多余的欢伏;就下圖入挣,層級(jí)圖中的實(shí)心紅圈背后的白色背景 和 后面的灰色背景,當(dāng)白色背景顯示的層級(jí)高于 灰色背景時(shí)硝拧,灰色背景被白色背景擋住的部分就屬于OverDraw;


image.png

1:解決辦法:移除多余的background径筏;
2:使用clipXXX繪制要顯示的部分葛假;這個(gè)地方主要是思想:盡量只繪制需要展示的內(nèi)容;

如上就是GPU 優(yōu)化部分了滋恬,下面就是CPU優(yōu)化了聊训;

問題二: CPU 優(yōu)化

CPU 優(yōu)化即使用扁平化的設(shè)計(jì)優(yōu)化xml布局,減少view 的層級(jí)深度恢氯;
這里推薦使用一個(gè)工具h(yuǎn)ierarchy view 带斑;
作用1: 可以堅(jiān)持布局結(jié)構(gòu);
作用2: 可以測(cè)試布局繪制時(shí)間勋拟;
studio 自帶工具勋磕,但是在3.0之后 Android monitor 就移除了快捷鍵icon, 但是我們還是可以在 sdk 的tools ,目錄下面找到;

?  tools ls
NOTICE.txt        emulator          mksdcard          proguard
android           emulator-check    monitor           source.properties
bin               lib               package.xml       support
?  tools pwd
/Users/conan/Library/Android/sdk/tools

hierarchy-viewer官方文檔

值得注意的一點(diǎn)是指黎,默認(rèn)hierarchy-viewer只能調(diào)試模擬器朋凉,如果你想在真機(jī)上調(diào)試,那么你需要添加一個(gè)環(huán)境變量醋安,具體可以參考文檔杂彭;

ANDROID_HVPROTO=ddm 

hierarchy-viewer 可以用來分析view繪制的相對(duì)耗時(shí),分析onmeasure,onLayout,onDraw的相對(duì)耗時(shí);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末吓揪,一起剝皮案震驚了整個(gè)濱河市亲怠,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌柠辞,老刑警劉巖团秽,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異叭首,居然都是意外死亡习勤,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門焙格,熙熙樓的掌柜王于貴愁眉苦臉地迎上來图毕,“玉大人,你說我怎么就攤上這事眷唉∮璨” “怎么了?”我有些...
    開封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵冬阳,是天一觀的道長(zhǎng)蛤虐。 經(jīng)常有香客問我,道長(zhǎng)肝陪,這世上最難降的妖魔是什么驳庭? 我笑而不...
    開封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮氯窍,結(jié)果婚禮上嚷掠,老公的妹妹穿的比我還像新娘捏检。我一直安慰自己,他們只是感情好不皆,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開白布贯城。 她就那樣靜靜地躺著,像睡著了一般霹娄。 火紅的嫁衣襯著肌膚如雪能犯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天犬耻,我揣著相機(jī)與錄音踩晶,去河邊找鬼。 笑死枕磁,一個(gè)胖子當(dāng)著我的面吹牛渡蜻,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播计济,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼茸苇,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了沦寂?” 一聲冷哼從身側(cè)響起学密,我...
    開封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎传藏,沒想到半個(gè)月后腻暮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡毯侦,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年哭靖,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片侈离。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡试幽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出霍狰,到底是詐尸還是另有隱情,我是刑警寧澤饰及,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布蔗坯,位于F島的核電站,受9級(jí)特大地震影響燎含,放射性物質(zhì)發(fā)生泄漏宾濒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一屏箍、第九天 我趴在偏房一處隱蔽的房頂上張望绘梦。 院中可真熱鬧橘忱,春花似錦、人聲如沸卸奉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)榄棵。三九已至凝颇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間疹鳄,已是汗流浹背拧略。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留瘪弓,地道東北人垫蛆。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像腺怯,于是被迫代替她去往敵國(guó)和親袱饭。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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