Android 什么情況下會(huì)出現(xiàn)卡頓現(xiàn)象:
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ǔ);
下圖總結(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)]顯示邏輯)邏輯中移除不需要的背景甘有;
Android Render 優(yōu)化原理
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)的顏色茄茁,來完成圖像的顯示魂贬。
因?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;
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í);