引起性能問題的一個(gè)很重要的方面是因?yàn)檫^多復(fù)雜的繪制操作佣谐。我們可以通過工具來檢測(cè)并修復(fù)標(biāo)準(zhǔn)UI組件的Overdraw問題规伐,但是針對(duì)高度自定義的UI組件則顯得有些力不從心做盅。
有一個(gè)竅門是我們可以通過執(zhí)行幾個(gè)APIs方法來顯著提升繪制操作的性能。前面有提到過分扎,非可見的UI組件進(jìn)行繪制更新會(huì)導(dǎo)致Overdraw澄成。例如Nav Drawer從前置可見的Activity滑出之后,如果還繼續(xù)繪制那些在Nav Drawer里面不可見的UI組件,這就導(dǎo)致了Overdraw墨状。為了解決這個(gè)問題卫漫,Android系統(tǒng)會(huì)通過避免繪制那些完全不可見的組件來盡量減少Overdraw。那些Nav Drawer里面不可見的View就不會(huì)被執(zhí)行浪費(fèi)資源肾砂。
但是不幸的是列赎,對(duì)于那些過于復(fù)雜的自定義的View(重寫了onDraw方法),Android系統(tǒng)無法檢測(cè)具體在onDraw里面會(huì)執(zhí)行什么操作镐确,系統(tǒng)無法監(jiān)控并自動(dòng)優(yōu)化包吝,也就無法避免Overdraw了。但是我們可以通過canvas.clipRect()來幫助系統(tǒng)識(shí)別那些可見的區(qū)域源葫。這個(gè)方法可以指定一塊矩形區(qū)域诗越,只有在這個(gè)區(qū)域內(nèi)才會(huì)被繪制,其他的區(qū)域會(huì)被忽視臼氨。這個(gè)API可以很好的幫助那些有多組重疊組件的自定義View來控制顯示的區(qū)域掺喻。同時(shí)clipRect方法還可以幫助節(jié)約CPU與GPU資源芭届,在clipRect區(qū)域之外的繪制指令都不會(huì)被執(zhí)行储矩,那些部分內(nèi)容在矩形區(qū)域內(nèi)的組件,仍然會(huì)得到繪制褂乍。
除了clipRect方法之外持隧,我們還可以使用canvas.quickreject()來判斷是否沒和某個(gè)矩形相交,從而跳過那些非矩形區(qū)域內(nèi)的繪制操作逃片。做了那些優(yōu)化之后屡拨,我們可以通過上面介紹的Show GPU Overdraw來查看效果。