理解ConstraintLayout 對性能的好處

自從在17年GoogleI/O大會宣布了Constraintlayout,我們持續提升了布局的穩定性和布局編輯的支持。我們還為ConstraintLayout添加了一些新特性支持創建不同類型的布局,添加這些新特性,可以明顯的提升性能,在這里,我門將討論ContrainLayout是如何提升性能的。

Android是怎么繪制view的

為了更好的理解constrainLayout 的性能,我們先回顧android是怎么繪制視圖的。
當一個用戶把一個視圖呈現在眼前,android framework 直接讓視圖繪制自己,繪制的過程包括三個階段:

  1. measure
    系統完成視圖樹的自頂向下遍歷,以確定每個ViewGroup和View元素應該有多大。 當一個ViewGroup被測量時,它也測量它的子項。

  2. Layout
    另一個自上而下遍歷行為,每個ViewGroup使用在測量階段確定的大小來確定其子級的位置。

  3. Draw
    系統執行另一個自上而下的遍歷。 對于視圖樹中的每個對象,都會創建一個Canvas對象,以向GPU顯示繪圖命令列表。 這些命令包括ViewGroup和View對象的大小和位置,系統在前兩個階段確定的。

這里寫圖片描述

繪圖過程中的每個階段都需要對視圖樹進行自頂向下的遍歷。 因此,嵌入到視圖層次結構中的視圖越多,設備繪制視圖所需的時間和計算能力就越多。 通過在您的Android應用布局中保持扁平的層次結構,您可以為您的應用創建快速響應的用戶界面。

傳統布局結構的開銷
為了對著這個觀點的說明,讓我們創建一個使用LinearLayout和RelativeLayout對象的傳統布局層次結構。

這里寫圖片描述

當我們想實現上面的界面,如果我們使用傳統布局,XML布局文件包含下面的元素等級

<RelativeLayout><ImageView /><ImageView /><RelativeLayout><TextView /><LinearLayout><TextView /><RelativeLayout><EditText /></RelativeLayout></LinearLayout><LinearLayout><TextView /><RelativeLayout><EditText /></RelativeLayout></LinearLayout><TextView /></RelativeLayout><LinearLayout ><Button /><Button /></LinearLayout>
</RelativeLayout>

盡管在這種類型的視圖層次結構中通常有改進的空間,但您幾乎可以肯定仍然需要使用一些嵌套的視圖創建一個層次結構。

如前所述,嵌套層次結構可能會對性能產生不利影響。 讓我們使用Android Studio的Systrace工具來看看嵌套視圖如何實際影響UI性能。 我們以編程方式調用每個ViewGroup(ConstraintLayout和RelativeLayout)的度量和布局階段,并在度量和布局調用執行時觸發Systrace。 以下命令會生成一個概覽文件,其中包含20秒間隔內發生的關鍵事件(例如,昂貴的度量/布局傳遞):

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

Systrace會自動突出顯示此布局的(許多)性能問題,以及修復這些問題的建議。 通過點擊“警報”選項卡,您會發現繪制該視圖層次結構需要80個昂貴的測量和布局階段!

觸發許多昂貴的措施和布局階段是不是很理想; 如此大量的繪圖活動可能導致用戶注意到的跳幀。 我們可以得出這樣的結論:由于嵌套層次結構會導致布局性能較差,像RelativeLayout每次會測量子節點兩次。

這里寫圖片描述

ConstraintLayout 對象的好處

如果你使用ConstrainLayout 去創建相同的布局,XML文件會包含下面的元素架構.

<android.support.constraint.ConstraintLayout><ImageView /><ImageView /><TextView /><EditText /><TextView /><TextView /><EditText /><Button /><Button /><TextView />
</android.support.constraint.ConstraintLayout>

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

舉個例子:我們看一下當一個TextView和一個EditText在一個布局的中間。

這里寫圖片描述
當我們使用RelativeLayout, 你需要創建一個新的ViewGroup來使EditText和TextView垂直對齊:

<LinearLayout
    android:id="@+id/camera_area"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="horizontal"android:layout_below="@id/title" ><TextView
        android:text="@string/camera"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:id="@+id/cameraLabel"android:labelFor="@+id/cameraType"android:layout_marginStart="16dp" /><RelativeLayout
        android:layout_width="match_parent"android:layout_height="wrap_content"><EditText
            android:id="@+id/cameraType"android:ems="10"android:inputType="textPersonName"android:text="@string/camera_value"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_marginTop="8dp"android:layout_marginStart="8dp"android:layout_marginEnd="8dp" /></RelativeLayout>
</LinearLayout>

通過使用ConstraintLayout來代替,只需從TextView的基線向EditText的基線添加一個約束而不創建另一個ViewGroup即可達到相同的效果:

這里寫圖片描述

<TextView
      android:layout_width="wrap_content"android:layout_height="wrap_content"app:layout_constraintLeft_creator="1"app:layout_constraintBaseline_creator="1"app:layout_constraintLeft_toLeftOf="@+id/activity_main_done"
app:layout_constraintBaseline_toBaselineOf="@+id/cameraType" />

在使用ConstraintLayout的布局版本上運行Systrace工具時,您會看到在相同的20秒間隔內,測量/布局合格率要低得多。 性能的改善是有意義的,現在我們保持視圖層次平坦!

這里寫圖片描述

在相關說明中,我們僅使用布局編輯器構建了布局的ConstraintLayout變體,而不是手動編輯XML。 為了使用RelativeLayout實現相同的視覺效果,我們可能需要手動編輯XML。

Measuring 的性能不同

我們通過使用Android 7.0(API級別24)中引入的OnFrameMetricsAvailableListener,分析了每種度量和布局通過兩種類型的布局ConstraintLayout和RelativeLayout所花費的時間。 此類允許您收集關于應用UI渲染的逐幀時間信息。

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

window.addOnFrameMetricsAvailableListener(frameMetricsAvailableListener, frameMetricsHandler);

定時信息變為可用后,應用程序將觸發frameMetricsAvailableListener()回調。 我們對度量/布局性能感興趣,因此在檢索實際幀持續時間時我們調用FrameMetrics.LAYOUT_MEASURE_DURATION。

Window.OnFrameMetricsAvailableListener {_, frameMetrics, _ ->val frameMetricsCopy = FrameMetrics(frameMetrics);// Layout measure duration in nanosecondsval layoutMeasureDurationNs = frameMetricsCopy.getMetric(FrameMetrics.LAYOUT_MEASURE_DURATION);

要了解有關FrameMetrics可以接收的其他類型的持續時間信息的更多信息,請參閱FrameMetrics API參考。

測試結果:ConstraintLayout is faster
我們的性能比較顯示,ConstraintLayout在度量/布局階段比RelativeLayout好40%左右:

這里寫圖片描述

正如這些結果所示,ConstraintLayout可能比傳統布局更具性能。 此外,ConstraintLayout還有其他一些功能可以幫助您構建復雜和高性能的布局,正如在ConstraintLayout對象部分中所討論的。 有關詳細信息,請參閱使用ConstraintLayout指南構建響應式UI。 我們建議您在設計應用程序的布局時使用ConstraintLayout。 幾乎在所有情況下,如果以前需要深度嵌套的布局,ConstraintLayout應該是您的最佳布局,以實現最佳性能和易用性。

附錄:測量環境
以上所有測量均在以下環境中進行。

deviceNexus 5X
android version8.0
contraintLayout version1.0.2

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/389092.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/389092.shtml
英文地址,請注明出處:http://en.pswp.cn/news/389092.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

數據湖 data lake_在Data Lake中高效更新TB級數據的模式

數據湖 data lakeGOAL: This post discusses SQL “UPDATE” statement equivalent for a data lake (object) storage using Apache Spark execution engine. To further clarify consider this, when you need to perform conditional updates to a massive table in a relat…

如何理解運維

運維工程師&#xff08;運營&#xff09;&#xff0c;負責維護并確保整個服務的高可用性&#xff0c;同時不斷優化系統架構提升部署效率&#xff0c;優化資源利用率提高整體的投資回報率。運維工程師面對的最大挑戰是大規模集群的管理問題&#xff0c;如何管理好幾十萬臺服務器…

advanced installer更換程序id_好程序員web前端培訓分享kbone高級-事件系統

好程序員web前端培訓分享kbone高級-事件系統&#xff1a;1、用法&#xff0c;對于多頁面的應用&#xff0c;在 Web 端可以直接通過 a 標簽或者 location 對象進行跳轉&#xff0c;但是在小程序中則行不通&#xff1b;同時 Web 端的頁面 url 實現和小程序頁面路由也是完全不一樣…

ai對話機器人實現方案_顯然地引入了AI —無代碼機器學習解決方案

ai對話機器人實現方案A couple of folks from Obviously.ai contacted me a few days back to introduce their service — a completely no-code machine learning automation tool. I was a bit skeptical at first, as I always am with supposedly fully-automated solutio…

網絡負載平衡的

網絡負載平衡允許你將傳入的請求傳播到最多達32臺的服務器上&#xff0c;即可以使用最多32臺服務器共同分擔對外的網絡請求服務。網絡負載平衡技術保證即使是在負載很重的情況下它們也能作出快速響應。 網絡負載平衡對外只須提供一個IP地址&#xff08;或域名&#xff09;。 如…

透明狀態欄導致windowSoftInputMode:adjustResize失效問題

當我們通過下面代碼&#xff1a; getWindow().getDecorView().setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN |View.SYSTEM_UI_FLAG_LIGHT_STATUS_BAR); 設置狀態欄透明&#xff0c;當界面存在EditText時&#xff0c;在activity里面設置windowSoftInputMode:…

[TimLinux] JavaScript 元素動態顯示

1. css的opacity屬性 這個屬性用于&#xff1a;設置元素的不透明級別&#xff0c;取值范圍&#xff1a;從 0.0 &#xff08;完全透明&#xff09;到 1.0&#xff08;完全不透明&#xff09;&#xff0c;元素所在的文本流還在。這個屬性的動態變化可以用來設置元素的淡入淡出效果…

神經網絡 CNN

# encodingutf-8import tensorflow as tfimport numpy as npfrom tensorflow.examples.tutorials.mnist import input_datamnist input_data.read_data_sets(MNIST_data, one_hotTrue)def weight_variable(shape): initial tf.truncated_normal(shape, stddev0.1) # 定義…

圖片中的暖色或冷色濾色片是否會帶來更多點擊? —機器學習A / B測試

A/B test on ads is the art of choosing the best advertisement that optimizes your goal (number of clicks, likes, etc). For example, if you change a simple thing like a filter in your pictures you will drive more traffic to your links.廣告的A / B測試是一種選…

3d制作中需要注意的問題_淺談線路板制作時需要注意的問題

PCB電路板是電子設備重要的基礎組裝部件&#xff0c;在制作PCB電路板時&#xff0c;只有將各個方面都考慮清楚&#xff0c;才能保證電子設備在使用時不會出現問題。今天小編就與大家一起分享線路板制作時需要注意的問題&#xff0c;歸納一下幾點&#xff1a;1、考慮制作類型電路…

冷啟動、熱啟動時間性能優化

用戶希望應用程序能夠快速響應并加載。 一個啟動速度慢的應用程序不符合這個期望&#xff0c;可能會令用戶失望。 這種糟糕的體驗可能會導致用戶在應用商店中對您的應用進行糟糕的評價&#xff0c;甚至完全放棄您的應用。 本文檔提供的信息可幫助您優化應用的啟動時間。 它首先…

python:lambda、filter、map、reduce

lambda 為關鍵字。filter&#xff0c;map&#xff0c;reduce為內置函數。 lambda&#xff1a;實現python中單行最小函數。 g lambda x: x * 2 #相當于 def g(x):return x*2print(g(3))# 6 注意&#xff1a;這里直接g(3)可以執行&#xff0c;但沒有輸出的&#xff0c;前面的…

集群

原文地址&#xff1a;http://www.microsoft.com/china/MSDN/library/windev/COMponentdev/CdappCEnter.mspx?mfrtrue 本文假設讀者熟悉 Windows 2000、COM、IIS 5.0 摘要 Application Center 2000 簡化了從基于 Microsoft .NET 的應用程序到群集的部署&#xff0c;群集是一組…

Myeclipes連接Mysql數據庫配置

相信大家在網站上也找到了許多關于myeclipes如何連接mysql數據庫的解決方案&#xff0c;雖然每一步都按照他的步驟來&#xff0c;可到最后還是提示連接失敗&#xff0c;有的方案可能應個人設備而異&#xff0c;配置環境不同導致。經過個人多方探索終于找到一個簡單便捷的配置方…

cnn圖像二分類 python_人工智能Keras圖像分類器(CNN卷積神經網絡的圖片識別篇)...

上期文章我們分享了人工智能Keras圖像分類器(CNN卷積神經網絡的圖片識別的訓練模型)&#xff0c;本期我們使用預訓練模型對圖片進行識別&#xff1a;Keras CNN卷積神經網絡模型訓練導入第三方庫from keras.preprocessing.image import img_to_arrayfrom keras.models import lo…

圖卷積 節點分類_在節點分類任務上訓練圖卷積網絡

圖卷積 節點分類This article goes through the implementation of Graph Convolution Networks (GCN) using Spektral API, which is a Python library for graph deep learning based on Tensorflow 2. We are going to perform Semi-Supervised Node Classification using C…

[微信小程序] 當動畫(animation)遇上延時執行函數(setTimeout)出現的問題

小程序中當動畫animation遇上setTimeout函數內部使用this.setData函數&#xff0c;通常情況下會出現報錯。本文先告訴解決方法&#xff0c;后分析報錯原因 1.解決方法&#xff1a; 在 setTimeout() 函數的同級加上 const that this; &#xff0c;然后將this.setData換成that…

關于使用pdf.js預覽pdf的一些問題

手機應用中pdf展示使用非常廣泛&#xff0c; 一些pdf由于特殊的內容比如文字、電子簽章必須使用復雜的解析器來解析&#xff0c;當使用MultiPdf 這個庫加載&#xff0c;會使得包變得非常龐大&#xff0c; 這里我們考慮使用pdf.js 來解析pdf. 引用非常簡單&#xff0c;只需要把…

SqlHelper改造版本

using System;using System.Configuration;using System.Data;using System.Data.SqlClient;using System.Collections; /// <summary> /// SqlHelper類是專門提供給廣大用戶用于高性能、可升級和最佳練習的sql數據操作 /// </summary> public abstract c…

回歸分析預測_使用回歸分析預測心臟病。

回歸分析預測As per the Centers for Disease Control and Prevention report, heart disease is the prime killer of both men and women in the United States and around the globe. There are several data mining techniques that can be leveraged by researchers/ stat…