上次講到了什麼是android裝置的卡頓以及定位卡頓的原因的工具。這次來看看與螢幕繪製相關。
gpu過度繪製(overdraw)是什麼?
overdraw是指在一幀的時間內(1/60s)畫素被繪製了多次。理論上的最優是只繪製一次,但是重疊的布局會導致某些畫素被繪製多次,當繪製畫素的時常超過1/60s時,就會出現丟幀。
為了避免出現丟幀,使得程式執行的更加流暢,我們在設計ui的時候就需要考慮如何減少overdraw的次數。
android的開發者選項裡提供了測量overdraw的選項。
開發者選項->顯示gpu過度渲染。如果開啟沒有效果的話,可以試試關閉掉硬體加速。
優化的原則就是:盡量避免重疊不可見元素的再繪製。
tips1:去除不必要的背景資源
在theme中新增android:windowbackground=」null」
在activity中設定getwindow().setbackgrounddrawable(null),該語句需要寫在setcontentview()之後。因為setcontentview()會預設給activity設定乙個背景。
左圖是沒有設定activity背景為null,右圖將activity背景設定為null.可見,上述的方法是有效的。
tips2:分段設定背景,儘量減少使用viewgroup的巢狀層數。
上面的ui是用relativelayout巢狀實現的,巢狀層數為四層。現在將其改為linearlayout來實現。
瞬間清爽了,有沒有?完全沒有overdraw,整個背景層就只繪製了一次。
tips3:使用標籤
merge標籤可以除去乙個view的層級。
merge標籤的使用限制:子檢視不能指定任何針對父檢視的布局屬性,例如:layout_centerhorizontal、layout_alignparentbottom等。
現有個relativelayout-textview檢視,如下:
此時textview繪製了三次,relativelayout繪製了兩次,activity的背景繪製了一次。然後,再將relativelayout替換成merge,如下:
瞬間繪製的次數都少了一次,有麼有?
注:當使用merge標籤的時候,activity的背景就不需要設定為空了,否則merge標籤不生效。
tips4:用9patch來做控制項的背景,有效的減少控制項的重疊區域。
應用場景:某控制項需要設定邊框背景,預設是用一張來做背景,在控制項內再去繪製其他元素。這樣至少其中的元素要被重繪兩次。如果將背景用9patch圖來做的話,控制項內的其他元素則至少只用繪製一次即可了。
總結來說:過度重繪總是有辦法解決的,但是需要針對不同情況採用不同的方法。靈活使用以上的方法,才可以達到預期想要的效果。
Android效能優化小集二
本文結合最近的一本比較火的書總結出來的一些經驗,對android記憶體的使用上能有幫助 1 避免建立不必要的物件。2 如果方法用不到成員變數,可以把方法宣告為static,這樣效能會提高15 到20 3 避免使用get set獲取屬性,可以直接宣告為static,直接訪問 4 static的變數如果...
Android效能優化
android效能優化 1.http用gzip壓縮,設定連線超時時間和響應超時時間 http請求按照業務需求,分為是否可以快取和不可快取,那麼在無網路的環境中,仍然通過快取的httpresponse瀏覽部分資料,實現離線閱讀。2.listview 效能優化 1 復用convertview 在geti...
Android效能優化
1.節制地使用service 如果應用程式當中需要使用service來執行後台任務的話,請一定要注意只有當任務正在執行的時候才應該讓service執行起來。另外,當任務執行完之後去停止service的時候,要小心service停止失敗導致記憶體洩露的情況 2.當介面不可見時釋放記憶體 當使用者開啟另...