成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

解析ConstraintLayout的性能優勢

企業動態
我們針對 ConstraintLayout 增加了一些新功能,幫助您構建不同類型的布局,例如引入鏈和按比例設置大小。除了這些功能之外,使用 ConstraintLayout 還可以獲得一項顯著的性能優勢。在本文中,我們將向您介紹如何從這些性能改進中獲益。

自從在去年的 Google I/O 大會上發布 ConstraintLayout 以來,我們一直不斷改進該布局的穩定性,完善對布局編輯器的支持。我們還針對 ConstraintLayout 增加了一些新功能,幫助您構建不同類型的布局,例如引入鏈和按比例設置大小。

除了這些功能之外,使用 ConstraintLayout 還可以獲得一項顯著的性能優勢。在本文中,我們將向您介紹如何從這些性能改進中獲益。

一、Android 如何繪制視圖?

為了更好地理解 ConstraintLayout 的性能,我們先回過頭來看看 Android 如何繪制視圖。

當用戶將某個 Android 視圖作為焦點時,Android 框架會指示該視圖進行自我繪制。這個繪制過程包括 3 個階段:

1. 測量

系統自頂向下遍歷視圖樹,以確定每個 ViewGroup 和 View 元素應當有多大。在測量 ViewGroup 的同時也會測量其子對象。

2. 布局

系統執行另一個自頂向下的遍歷操作,每個 ViewGroup 都根據測量階段中所確定的大小來確定其子對象的位置。

3. 繪制

系統再次執行一個自頂向下的遍歷操作。對于視圖樹中的每個對象,系統會為其創建一個 Canvas 對象,以便向 GPU 發送一個繪制命令列表。這些命令包含系統在前面 2 個階段中確定的 ViewGroup 和 View 對象的大小和位置。

測量階段如何遍歷視圖樹的示例

▲ 測量階段如何遍歷視圖樹的示例

繪制過程中的每個階段都需要對視圖樹執行一次自頂向下的遍歷操作。因此,視圖層次結構中嵌入(或嵌套)的視圖越多,設備繪制視圖所需的時間和計算功耗也就越多。通過在 Android 應用布局中保持扁平的層次結構,您可以為應用創建響應快速而靈敏的界面。

二、傳統布局層次結構的開銷

請牢記上述解釋,下面我們來創建一個使用 LinearLayout 和 RelativeLayout 對象的傳統布局層次結構。

 布局示例

▲ 布局示例

假設我們想構建一個像上圖那樣的布局。如果您使用傳統布局來構建,XML 文件會包含類似于下面這樣的元素層次結構(在本例中,我們忽略屬性):

  1. <RelativeLayout> 
  2.   <ImageView /> 
  3.   <ImageView /> 
  4.   <RelativeLayout> 
  5.     <TextView /> 
  6.     <LinearLayout> 
  7.       <TextView /> 
  8.       <RelativeLayout> 
  9.         <EditText /> 
  10.       </RelativeLayout> 
  11.     </LinearLayout> 
  12.     <LinearLayout> 
  13.       <TextView /> 
  14.       <RelativeLayout> 
  15.         <EditText /> 
  16.       </RelativeLayout> 
  17.     </LinearLayout> 
  18.     <TextView /> 
  19.   </RelativeLayout> 
  20.   <LinearLayout > 
  21.     <Button /> 
  22.     <Button /> 
  23.   </LinearLayout> 
  24. </RelativeLayout> 

盡管一般來說,這種類型的視圖層次結構都有改進的空間,但您幾乎必定還需要創建一個包含一些嵌套視圖的層次結構。

如前所述,嵌套的層次結構會給性能造成負面影響。我們使用 Android Studio 的 Systrace 工具來看看嵌套視圖對界面性能到底有何實際影響。我們通過編程方式針對每個 ViewGroup(ConstraintLayout 和 RelativeLayout)調用了測量和布局階段并在執行測量和布局調用期間觸發了 Systrace。以下命令可生成一個包含 20 秒間隔周期內發生的關鍵 Event 的概覽文件,例如開銷巨大的測量/布局階段:

  1. python $ANDROID_HOME/platform-tools/systrace/systrace.py --time=20 -o ~/trace.html gfx view res 

有關如何使用 Systrace 的詳細信息,請參閱使用 Systrace 分析界面性能指南:

https://developer.android.google.cn/studio/profile/systrace.html

Systrace 會自動突出顯示此布局中的(大量)性能問題,并給出修復這些問題的建議。通過點擊“Alerts”標簽,您會發現,繪制此視圖層次結構需要反復執行 80 次的測量和布局階段,開銷極為龐大!

觸發開銷如此龐大的測量和布局階段當然很不理想,如此龐大的繪制 Activity 會導致用戶能夠覺察到丟幀的現象。我們可以得出這樣的結論:這種嵌套式層次結構和 RelativeLayout(會對其每個子對象重復測量兩次)的特性導致性能低下。

觀察 Systrace 針對使用 RelativeLayout 的布局版本發出的提醒

▲ 觀察 Systrace 針對使用 RelativeLayout 的布局版本發出的提醒

您可以在我們的 GitHub 代碼庫中查看我們用來執行這些測量的完整代碼:

https://github.com/googlesamples/android-constraint-layout-performance

三、ConstraintLayout 對象的優勢

如果您使用 ConstraintLayout 來構建相同的布局,XML 文件會包含類似于下面這樣的元素層次結構(再次忽略屬性):

  1. <android.support.constraint.ConstraintLayout> 
  2.   <ImageView /> 
  3.   <ImageView /> 
  4.   <TextView /> 
  5.   <EditText /> 
  6.   <TextView /> 
  7.   <TextView /> 
  8.   <EditText /> 
  9.   <Button /> 
  10.   <Button /> 
  11.   <TextView /> 
  12. </android.support.constraint.ConstraintLayout> 

如本例所示,現在,該布局擁有一個完全扁平的層次結構。這是因為 ConstraintLayout 允許您構建復雜的布局,而不必嵌套 View 和 ViewGroup 元素。

舉個例子,我們來看一下布局中間的 TextView 和 EditText:

使用 RelativeLayout 時,您需要創建一個新的 ViewGroup 來垂直對齊 EditText 和 TextView:

  1. <LinearLayout 
  2.     android:id="@+id/camera_area" 
  3.     android:layout_width="match_parent" 
  4.     android:layout_height="wrap_content" 
  5.     android:orientation="horizontal" 
  6.     android:layout_below="@id/title" > 
  7.  
  8.     <TextView 
  9.         android:text="@string/camera" 
  10.         android:layout_width="wrap_content" 
  11.         android:layout_height="wrap_content" 
  12.         android:layout_gravity="center_vertical" 
  13.         android:id="@+id/cameraLabel" 
  14.         android:labelFor="@+id/cameraType" 
  15.         android:layout_marginStart="16dp" /> 
  16.  
  17.     <RelativeLayout 
  18.         android:layout_width="match_parent" 
  19.         android:layout_height="wrap_content"> 
  20.  
  21.         <EditText 
  22.             android:id="@+id/cameraType" 
  23.             android:ems="10" 
  24.             android:inputType="textPersonName" 
  25.             android:text="@string/camera_value" 
  26.             android:layout_width="match_parent" 
  27.             android:layout_height="wrap_content" 
  28.             android:layout_centerVertical="true" 
  29.             android:layout_marginTop="8dp" 
  30.             android:layout_marginStart="8dp" 
  31.             android:layout_marginEnd="8dp" /> 
  32.     </RelativeLayout> 
  33. </LinearLayout> 

 

 

通過改用 ConstraintLayout,您只需添加一個從 TextView 基線到 EditText 基線之間的約束,即可實現同樣的效果,而不必創建另一個 ViewGroup:

EditText 和 TextView 之間的約束

▲ EditText 和 TextView 之間的約束

在針對我們使用 ConstraintLayout 的布局版本運行 Systrace 工具時,您會發現,同樣 20 秒間隔周期內執行的測量/布局次數大大減少,開銷也隨之大大減少。這種性能的改進很有意義,現在,我們保持了扁平的視圖層次結構!

 觀察 Systrace 針對使用 ConstraintLayout 的布局版本發出的提醒

觀察 Systrace 針對使用 ConstraintLayout 的布局版本發出的提醒

同樣值得一提的是,我們構建 ConstraintLayout 版本的布局時僅僅使用了布局編輯器,而不是手工編輯 XML。而要使用 RelativeLayout 來實現同樣的視覺效果,我們很可能必須手工編輯 XML。

四、測量性能差異

我們使用 Android 7.0(API 級別 24)中引入的 OnFrameMetricsAvailableListener 分析了 ConstraintLayout 和 RelativeLayout 這兩種類型的布局所執行的每次測量和布局操作所花費的時間。通過該類,您可以收集有關應用界面渲染的逐幀時間信息。

通過調用以下代碼,您可以開始記錄每個幀的界面操作:

  1. window.addOnFrameMetricsAvailableListener( 
  2.         frameMetricsAvailableListener, frameMetricsHandler); 

在能夠獲取時間信息之后,該應用觸發 frameMetricsAvailableListener() 回調。我們對測量/布局的性能感興趣,因此,我們在檢索實際幀的持續時間時調用了 FrameMetrics.LAYOUT_MEASURE_DURATION。

  1. Window.OnFrameMetricsAvailableListener { 
  2.         _, frameMetrics, _ -> 
  3.         val frameMetricsCopy = FrameMetrics(frameMetrics); 
  4.         // Layout measure duration in nanoseconds 
  5.         val layoutMeasureDurationNs =  
  6.                 frameMetricsCopy.getMetric(FrameMetrics.LAYOUT_MEASURE_DURATION); 

如需詳細了解 FrameMetrics 可以檢索的其他類型的持續時間信息,請參閱 FrameMetricsAPI 參考:

https://developer.android.google.cn/reference/android/view/FrameMetrics.html

五、測量結果:ConstraintLayout 速度更快

我們的性能比較結果表明:ConstraintLayout 在測量/布局階段的性能比 RelativeLayout大約高 40%:

 測量/布局(單位:毫秒,100 幀的平均值)

▲ 測量/布局(單位:毫秒,100 幀的平均值)

這些結果表明:ConstraintLayout 很可能比傳統布局的性能更出色。不僅如此,ConstraintLayout 還具備其他一些功能,能夠幫助您構建復雜的高性能布局。

有關詳情,請參閱使用 ConstraintLayout 構建快速響應的界面指南:

https://medium.com/google-developers/building-interfaces-with-constraintlayout-3958fa38a9f7

我們建議您在設計應用布局時使用 ConstraintLayout。在過去,幾乎所有情形下,您都需要一個深度嵌套的布局,因此,ConstraintLayout 應當成為您優化性能和易用性的不二之選。

六、附錄:測量環境 & 后續計劃

上述所有測量均在以下環境中執行:

  • 設備 - Nexus 5X
  • Android 版本 - 8.0
  • ConstraintLayout 版本 - 1.0.2
  • 查看開發者指南:https://developer.android.google.cn/training/constraint-layout/index.html
  • API 參考文檔:https://developer.android.google.cn/reference/android/support/constraint/ConstraintLayout.html
  • 媒體文章:https://medium.com/google-developers/building-interfaces-with-constraintlayout-3958fa38a9f7

【本文是51CTO專欄機構“谷歌開發者”的原創稿件,轉載請聯系原作者(微信公眾號:Google_Developers)】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2023-02-22 09:47:40

查詢計算

2011-05-08 17:23:15

英特爾優勢

2009-12-22 16:55:26

WCF性能優勢

2023-04-17 16:33:27

云計算工具云性能測試

2010-07-30 13:15:17

Flex優勢

2009-04-08 10:34:00

IPSec VPN協議

2011-07-01 09:36:30

高性能Web

2017-10-24 06:52:27

性能監測可視化

2009-07-01 18:12:18

JSP的優勢性能比較

2010-04-12 12:59:19

Wi-Fi無線技術優勢

2009-12-30 16:01:32

Linux性能

2010-09-06 15:00:40

DB2 9 XML

2022-03-29 07:20:04

密封類.NET性能

2010-02-23 16:28:28

CentOS Fast

2010-04-19 12:17:09

雙模AP無線網絡

2010-05-27 16:17:46

IPv6協議

2023-09-26 22:34:12

開發const char

2012-12-14 01:52:49

JVM淘寶JVMtaobao jvm

2023-12-25 09:51:13

性能測試

2009-05-06 16:52:01

虛擬化LinuxKVM
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲精品电影网在线观看 | 91动漫在线观看 | 日韩午夜精品 | 日韩精品专区在线影院重磅 | 亚洲精品久久久9婷婷中文字幕 | 亚洲视频三区 | 欧美日韩精品影院 | 精品国产精品三级精品av网址 | 国产性生活一级片 | 久久大香 | 久久人人网 | 99re视频在线 | 成人深夜福利网站 | 亚洲国产精品一区二区www | 亚洲欧美国产一区二区三区 | 国产一区二区欧美 | 成人精品一区二区三区 | 91成人免费电影 | 亚洲精品乱码久久久久v最新版 | 成人免费视屏 | 欧美日韩一区在线观看 | 欧美一级黄色免费看 | 隔壁老王国产在线精品 | 久久久久久久91 | 国产一区二区在线免费观看 | 欧美一区二区三区一在线观看 | 国产精品不卡视频 | 国产精品永久久久久久久www | 中文字幕 在线观看 | 欧美激情在线播放 | 中文字幕第49页 | 成人精品网 | 欧美日韩在线不卡 | 成人午夜性成交 | 久久草在线视频 | 97国产一区二区精品久久呦 | 一区二区免费视频 | 成人久久久久久久久 | 天堂在线www | 二区av| 精品国产一区探花在线观看 |