图片和图形之性能和视图层次结构(18)
原文
概要
您管理View對象層次結構的方式可能會對應用程序的性能產生重大影響。本頁介紹如何評估您的視圖層次結構是否會減慢您的應用程序,并提供解決可能出現的問題的一些策略。
布局和衡量表現
渲染管道包括布局和度量 階段,在此階段系統會將相關項目適當地定位到您的視圖層次結構中。這個階段的度量部分決定了View對象的大小和邊界。布局部分決定了屏幕上放置View對象的位置。
這兩個流水線階段都會導致他們處理的每個視圖或布局的成本很低。大多數情況下,這個成本是最小的,并且不會顯著影響性能。但是,當應用程序添加或刪除View對象時,它可能會更大,例如 RecyclerView 對象回收它們或重新使用它們時。如果View對象需要考慮調整大小來限制它的約束,成本也可能更高:例如,如果您的應用程序調用 包裝文本SetText()的 View對象,則 View可能需要調整大小。
如果像這樣的情況花費太長時間,它們可以防止幀在允許的16ms內渲染,這樣幀就會被丟棄,動畫變得非常復雜。
由于您無法將這些操作移至工作線程 - 您的應用程序必須在主線程上處理它們,所以最好的辦法就是優化它們,以便盡可能縮短時間。
管理復雜性:布局很重要
Android Layouts 允許您在視圖層次結構中嵌套UI對象。這種嵌套也可能會增加布局成本。當您的應用程序處理布局對象時,應用程序也會對布局的所有子項執行相同的過程。對于復雜的布局,有時僅在系統首次計算布局時出現成本。例如,當您的應用程序在RecyclerView 對象中回收復雜的列表項時 ,系統需要布置所有對象。在另一個例子中,微不足道的變化可以傳播到父級,直到他們到達不影響父級大小的對象。
布局花費特別長時間的最常見情況是當View對象的層次結構彼此嵌套時。每個嵌套布局對象都會增加布局階段的成本。層次越平坦,布局階段完成所需的時間就越少。
如果您正在使用該RelativeLayout課程,則可以使用嵌套的未加權LinearLayout視圖以較低的成本達到相同的效果 。此外,如果您的應用目標為Android 7.0(API級別24),則很可能您可以使用特殊的布局編輯器來創建 ConstraintLayout 對象而不是RelativeLayout。這樣做可以避免本節描述的許多問題。該 ConstraintLayout 課程提供類似的布局控制,但性能大大提高。這個類使用它自己的約束解決系統以與標準布局截然不同的方式來解決視圖之間的關系。
雙重稅收
通常,框架一次執行布局 或度量階段,并且很快。但是,對于一些更復雜的布局情況,框架可能需要在層次結構的多個部分迭代多次,最終定位元素之前需要多次傳遞才能解析。不得不執行多個布局和度量迭代被稱為 雙重征稅。
例如,當您使用RelativeLayout允許您View根據其他View對象的位置來定位對象的容器時,框架將執行以下操作:
視圖層次越高,潛在的性能損失就越大。
- 除RelativeLayout可能導致雙重課稅的其他容器外。例如:
- 如果將LinearLayout視圖設置為水平,視圖可能會導致雙重布局和度量傳遞。如果添加measureWithLargestChild,則在垂直方向上也可能發生雙重布局和度量傳遞 ,在這種情況下,框架可能需要執行第二次傳遞才能解析正確大小的對象。
- 該GridLayout 有一個類似的問題。雖然這個容器也允許相對定位,但它通常通過預處理子視圖之間的位置關系來避免雙重征稅。但是,如果布局使用權重或填充 Gravity類,那么預處理的好處就會丟失,如果容器是a,框架可能必須執行多次傳遞RelativeLayout。
多個布局和度量通行證本身并不是性能負擔。但如果他們處于錯誤的位置,他們可能會變得如此。對于以下情況之一適用于您的容器的情況,您應該小心:
- 它是視圖層次結構中的根元素。
- 它下面有一個深層視圖層次結構。
- 它有很多填充屏幕的實例,類似于ListView對象中的兒童
診斷視圖層次結構問題
布局性能在許多方面都是一個復雜的問題。有幾個工具可以為您提供有關性能瓶頸發生位置的明確信息。其他一些工具提供的確切信息較少,但也可以提供有用的提示。
Systrace
Systrace 是一款內置于Android SDK中的工具,可提供有關性能的絕佳數據 。Systrace工具可讓您收集并檢查整個Android設備的計時信息,讓您了解布局性能問題何時會導致性能問題。有關Systrace的更多信息,請參閱使用Systrace分析UI性能。
Profile GPU渲染
最有可能為您提供有關性能瓶頸的具體信息的另一個工具是設備上的 配置文件GPU渲染工具,可用于采用Android 6.0(API級別23)和更高版本支持的設備。該工具允許您查看每個渲染幀的布局和度量階段所花費的時間。這些數據可幫助您診斷運行時性能問題,并幫助您確定需要解決的布局和度量問題。
在其捕獲的數據的圖形表示中, 配置文件GPU渲染使用藍色來表示布局時間。有關如何使用此工具的更多信息,請參閱 配置文件GPU渲染演練。
Lint
Android Studio的Lint工具可以幫助您獲得視圖層次結構中效率低下的感覺。要使用此工具,請選擇Analyze> Inspect Code,如圖1所示。
圖1.在Android Studio中查找Inspect代碼。
有關各種布局項目的信息顯示在 Android> Lint> Performance下。要查看更多詳細信息,可以單擊每個項目將其展開,并在屏幕右側的窗格中查看更多信息。圖2顯示了這種顯示器的一個例子。
圖2.查看有關lint工具已識別的特定問題的信息。
點擊其中一個項目,在右側窗格中顯示與該項目相關的問題。
要更多了解這方面的具體主題和問題,請參閱 Lint文檔。
布局檢查器
Android Studio的Layout Inspector 工具提供了應用視圖層次結構的直觀表示。這是一種瀏覽應用層次結構的好方法,它為特定視圖的父鏈提供清晰的視覺表示,并允許您檢查應用構造的布局。
Layout Inspector提出的觀點也可以幫助識別雙重征稅帶來的性能問題。它還可以為您提供一種輕松的方式來識別嵌套布局的深層鏈,或嵌套兒童的大量布局區域,這是潛在的性能成本的潛在來源。在這些情況下,布局和度量階段可能特別昂貴,導致性能問題。
有關更多信息,請參閱使用布局檢查器調試布局。
解決視圖層次結構問題
解決視圖層次結構中出現的性能問題背后的基本概念在概念上很簡單,但在實踐中更加困難。防止視圖層次結構施加性能處罰包含平坦視圖層次結構和減少雙重征稅的雙重目標。本節討論實現這些目標的一些策略。
刪除多余的嵌套布局
開發人員經常使用比必要更多的嵌套布局。例如,一個 RelativeLayout容器可能包含一個也是RelativeLayout容器的單個孩子 。這種嵌套意味著冗余,并為視圖層次結構增加了不必要的成本。
林特通常可以為您解決這個問題,減少調試時間。
采用 merge/include
冗余嵌套布局的一個常見原因是 <include>標簽。例如,您可以定義一個可重用的布局,如下所示:
<LinearLayout><!-- some stuff here --> </LinearLayout> </pre>然后使用include標簽將此項添加到父容器中:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"android:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"android:background="@color/app_bg"android:gravity="center_horizontal"><include layout="@layout/titlebar"/><TextView android:layout_width="match_parent"android:layout_height="wrap_content"android:text="@string/hello"android:padding="10dp" />...</LinearLayout>包含不必要地嵌套第二個布局中的第一個布局。
該合并 標簽可以幫助防止此問題。有關此標記的信息,請參閱 使用<include>重新使用布局。
采用更便宜的布局
您可能無法調整現有布局方案,使其不包含冗余布局。在某些情況下,唯一的解決方案可能是通過切換到完全不同的布局類型來平整您的層次結構。
例如,您可能會發現a TableLayout 提供了與具有多個位置依賴關系的更復雜布局相同的功能。在Android的N版本中, ConstraintLayout 該類提供了類似的功能 RelativeLayout,但成本顯著降低。
Lastest Update:2018.04.25
?
聯系我
QQ:94297366
微信打賞:https://pan.baidu.com/s/1dSBXk3eFZu3mAMkw3xu9KQ
?
公眾號推薦:
?
轉載于:https://blog.51cto.com/4789781/2120593
總結
以上是生活随笔為你收集整理的图片和图形之性能和视图层次结构(18)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: activiti 5.21工作流规则引擎
- 下一篇: Python3学习笔记(六):字符串