引起性能問題的一個很重要的方面是因為過多復雜的繪制操作。我們可以通過工具來檢測并修復標準UI組件的Overdraw問題,但是針對高度自定義的UI組件則顯得有些力不從心。
有一個竅門是我們可以通過執行幾個APIs方法來顯著提升繪制操作的性能。前面有提到過,非可見的UI組件進行繪制更新會導致Overdraw。例如Nav Drawer從前置可見的Activity滑出之后,如果還繼續繪制那些在Nav Drawer里面不可見的UI組件,這就導致了Overdraw。為了解決這個問題,Android系統會通過避免繪制那些完全不可見的組件來盡量減少Overdraw。那些Nav Drawer里面不可見的View就不會被執行浪費資源。
但是不幸的是,對于那些過于復雜的自定義的View(重寫了onDraw方法),Android系統無法檢測具體在onDraw里面會執行什么操作,系統無法監控并自動優化,也就無法避免Overdraw了。但是我們可以通過canvas.clipRect()來幫助系統識別那些可見的區域。這個方法可以指定一塊矩形區域,只有在這個區域內才會被繪制,其他的區域會被忽視。這個API可以很好的幫助那些有多組重疊組件的自定義View來控制顯示的區域。同時clipRect方法還可以幫助節約CPU與GPU資源,在clipRect區域之外的繪制指令都不會被執行,那些部分內容在矩形區域內的組件,仍然會得到繪制。
除了clipRect方法之外,我們還可以使用canvas.quickreject()來判斷是否沒和某個矩形相交,從而跳過那些非矩形區域內的繪制操作。做了那些優化之后,我們可以通過上面介紹的Show GPU Overdraw來查看效果。