Android性能優(yōu)化系列——過度繪制解決方案

同樣附上我的github <a> https://github.com/BudSpore</a>
上一篇文章我們對UI的渲染機(jī)制有了簡單的了解,通過渲染原理我們知道UI渲染流程要在16ms內(nèi)完成础爬,本篇文章我將給大家講解Android性能優(yōu)化里面的一小部分內(nèi)容,給開發(fā)者們提供一些思路看蚜,其實(shí)造成性能問題還有很多,內(nèi)存泄露供炎,電量,線程阻塞碱茁,代碼低耦合......好在現(xiàn)在有不少的解決方案,阿里巴巴的雙11App流暢度做了極大的優(yōu)化墓贿,作者最近因為找工作,從中對阿里的Weex產(chǎn)生了濃厚的興趣聋袋,我會在后面的文章中再慢慢研究,不過Weex學(xué)習(xí)成本真是好大啊幽勒,感慨一下。

Paste_Image.png

該文我們先從GPU分析啥容。屏幕顯示圖片的時候顷霹,需要先經(jīng)過CPU的計算加載到內(nèi)存中,然后傳遞給GPU進(jìn)行渲染淋淀。文字的顯示比較復(fù)雜,需要先經(jīng)過CPU換算成紋理,然后交給GPU進(jìn)行渲染炭臭,返回到CPU繪制單個字符的時候,再重新引用經(jīng)過GPU渲染的內(nèi)容鞋仍。動畫則存在一個更加復(fù)雜的操作流程,我們在追求華麗的視覺效果的時候凿试,會用到多層重疊視圖去實(shí)現(xiàn),這會導(dǎo)致性能上出現(xiàn)問題那婉。
<h3>UI渲染會遇到的問題</h3>
<h4>GPU的過度繪制</h4>
Overdraw(過度繪制)是屏幕上的某個像素在同一幀的時間內(nèi)被繪制了多次。在多層次的UI結(jié)構(gòu)里面盐类, 如果不可見的UI也在做繪制的操作,這就會導(dǎo)致某些像素區(qū)域被繪制了多次

圖像覆蓋現(xiàn)象會導(dǎo)致GPU繪制的過程中無用圖層繪制在底層在跳,造成不必要的浪費(fèi)隐岛。

Paste_Image.png

我用的是三星手機(jī)(不是Note 7)猫妙,Android機(jī)大概按照以下步驟打開Show GPU Overrdraw:設(shè)置 -> 開發(fā)者選項 -> 調(diào)試GPU過度渲染--> 顯示過度渲染區(qū)域

Paste_Image.png

然后就可以看到下圖:

Paste_Image.png

我們看到了屏幕里多了不少帶顏色的框框割坠,我們對這些框框分析一下:

Paste_Image.png

藍(lán)色,淡綠彼哼,粉湘今,深紅代表了4種不同程度的GPU過度繪制情況,
藍(lán)色: GPU過度繪制了 1倍敢朱。像素繪制了兩次摩瞎。大片的藍(lán)色還是可以接受的(若整個窗口是藍(lán)色的,可以擺脫一層)旗们。
綠色: GPU過度繪制了 2倍。像素繪制了三次蚪拦。中等大小的綠色區(qū)域是可以接受的但你應(yīng)該嘗試優(yōu)化、減少它們驰贷。
淡紅: GPU過度繪制了 3倍。像素繪制了四次括袒,小范圍可以接受。
深紅: GPU過度繪制了 4倍锹锰。像素繪制了五次或者更多。這是錯誤的恃慧,要修復(fù)它們。
我們的目標(biāo)就是盡量減少紅色Overdraw痢士,看到更多的藍(lán)色區(qū)域。
<h4>解決方案</h4>

  • 移除Window默認(rèn)的Background
    getWidow.setBackgroundDrawable(null);
  • 移除XML布局文件中非必需的Background
  • 按需求顯示占位背景圖片
  • 減少布局嵌套(扁平化的一個體現(xiàn)怠蹂,減少View數(shù)的深度,也就減少了View樹的遍歷時間易遣,渲染的時候,前后期的工作豆茫,總是按View樹結(jié)點(diǎn)來)
    這些都是一些常識了,我簡單帶過澜薄。。
  • <h6>ClipRect</h6>
    我們平時使用NavigationView的時候肤京,側(cè)滑出Nav Drawer,Nav Drawer里面不可見的View就不會被Overdraw。


    Paste_Image.png

    圖中橙色區(qū)域不會被重繪忘分。

一旦我們自定義View白修,重寫onDraw()方法妒峦,方法里對View的操作將會重繪兵睛,然而我們可以通過canvas.clipRect()來幫助系統(tǒng)識別那些可見的區(qū)域窥浪。這個方法可以指定一塊矩形區(qū)域,只有在這個區(qū)域內(nèi)才會被繪制漾脂,其他的區(qū)域會被忽視。這個API可以很好的幫助那些有多組重疊組件的自定義View來控制顯示的區(qū)域骨稿。同時clipRect方法還可以幫助節(jié)約CPU與GPU資源,在clipRect區(qū)域之外的繪制指令都不會被執(zhí)行坦冠,那些部分內(nèi)容在矩形區(qū)域內(nèi)的組件哥桥,仍然會得到繪制
應(yīng)用場景:當(dāng)我們在自定義View的時候辙浑,可能會出現(xiàn)圖片重疊導(dǎo)致Overdraw泰讽,當(dāng)我們使用canvas.clipRect(),會提高性能已卸,另外,在onDraw方法里面盡量不要有耗時操作累澡,

  • ViewStub(延遲化加載)
    主要的應(yīng)用場景就比如說新聞App,打開某個界面愧哟,如果有網(wǎng)絡(luò)就展示內(nèi)容,沒有網(wǎng)絡(luò)就會提示出網(wǎng)絡(luò)連接出錯蕊梧,這個出錯提示就是ViewStub,在正確的條件下才會顯示出內(nèi)容肥矢。
  • include(引入布局)
    當(dāng)不同的界面有相同的UI元素的時候我們可以使用include標(biāo)簽,不過引入的布局還可能會被嵌套在LinearLayout,RelativeLayout里面甘改。所以引入merge標(biāo)簽。
  • merge
    在引入布局文件里面抵代,最外層可以用merge替代LinearLayout,RelativeLayout,這樣把子UI元素直接銜接在include位置荤牍。

另外RelativeLayout通常會對它們的子視圖進(jìn)行2次測量案腺,子視圖使用了layout_weight屬性的LinearLayout也會對它的子視圖進(jìn)行2次測量参淫;我們一般推薦使用RelativeLayout救湖,然而我們視項目具體問題具體分析涎才。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末力九,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子跌前,更是在濱河造成了極大的恐慌,老刑警劉巖抵乓,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異茎芋,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)田弥,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進(jìn)店門铡原,熙熙樓的掌柜王于貴愁眉苦臉地迎上來偷厦,“玉大人燕刻,你說我怎么就攤上這事只泼÷严矗” “怎么了?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵籍滴,是天一觀的道長。 經(jīng)常有香客問我孽惰,道長,這世上最難降的妖魔是什么勋功? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮狂鞋,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘骚揍。我一直安慰自己字管,他們只是感情好信不,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抽活,像睡著了一般。 火紅的嫁衣襯著肌膚如雪下硕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天霜幼,我揣著相機(jī)與錄音,去河邊找鬼辛掠。 笑死,一個胖子當(dāng)著我的面吹牛萝衩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播没咙,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼牌捷!你這毒婦竟也來了涡驮?” 一聲冷哼從身側(cè)響起暗甥,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捉捅,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后棒口,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寄月,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年厂抖,在試婚紗的時候發(fā)現(xiàn)自己被綠了克懊。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片忱辅。...
    茶點(diǎn)故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡谭溉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出夜只,到底是詐尸還是另有隱情蒜魄,我是刑警寧澤,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布谈为,位于F島的核電站,受9級特大地震影響伞鲫,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秕脓,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一吠架、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧傍药,春花似錦、人聲如沸拣挪。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽闸英。三九已至,卻和暖如春出吹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背捶牢。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工秋麸, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留炬太,地道東北人。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓炒考,卻偏偏與公主長得像霎迫,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子知给,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評論 2 355

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