理解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.mzph.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…

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;。 如…

神经网络 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…

回归分析预测_使用回归分析预测心脏病。

回归分析预测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…

crc16的c语言函数 计算ccitt_C语言为何如此重要

●●●如今&#xff0c;有很多学生不懂为何要学习编程语言&#xff0c;为何要学习C语言&#xff1f;原因是大学生不能满足于只会用办公软件&#xff0c;而应当有更高的学习要求&#xff0c;对于理工科的学生尤其如此。计算机的本质是“程序的机器”&#xff0c;程序和指令的思想…

aws spark_使用Spark构建AWS数据湖时的一些问题以及如何处理这些问题

aws spark技术提示 (TECHNICAL TIPS) 介绍 (Introduction) At first, it seemed to be quite easy to write down and run a Spark application. If you are experienced with data frame manipulation using pandas, numpy and other packages in Python, and/or the SQL lang…

冲刺第三天 11.27 TUE

任务执行情况 已解决问题 数据库结构已经确定 对联生成model已训练完成 词匹配部分完成 微信前端rush版本完成 总体情况 团队成员今日已完成任务剩余任务困难Dacheng, Weijieazure数据库搭建(完成&#xff09;multiple communication scripts, call APIs需要进行整合调试Yichon…

DPDK+Pktgen 高速发包测试

参考博客 Pktgen概述 Pktgen,(Packet Gen-erator)是一个基于DPDK的软件框架&#xff0c;发包速率可达线速。提供运行时管理&#xff0c;端口实时测量。可以控制 UDP, TCP, ARP, ICMP, GRE, MPLS and Queue-in-Queue等包。可以通过TCP进行远程控制。Pktgen官网 安装使用过程 版本…

数据科学家编程能力需要多好_我们不需要这么多的数据科学家

数据科学家编程能力需要多好I have held the title of data scientist in two industries. I’ve interviewed for more than 30 additional data science positions. I’ve been the CTO of a data-centric startup. I’ve done many hours of data science consulting.我曾担…

excel表格行列显示十字定位_WPS表格:Excel表格打印时,如何每页都显示标题行?...

电子表格数据很多的时候&#xff0c;要分很多页打印&#xff0c;如何每页都能显示标题行呢&#xff1f;以下表为例&#xff0c;我们在WPS2019中演示如何每页都显示前两行标题行&#xff1f;1.首先点亮顶部的页面布局选项卡。然后点击打印标题或表头按钮。2.在弹出的页面设置对话…