【问题标题】:Is Constraint Layout expensive compared to others?约束布局与其他布局相比是否昂贵?
【发布时间】:2018-09-26 17:15:41
【问题描述】:

当我意识到 ConstraintLayout 有:

  • 更好的布局拖放

  • 通过更好的命名“top-toBottomOf”更好地查看相对设置

  • 使用比率和百分比指南更好地构建布局

  • 还有很多不能在这里说明或者我只是不知道

我一直想经常使用它,因为它很舒服。

就像标题一样,我很好奇ConstraintLayout 在持续使用时会不会对性能产生很大影响?

陈述您的意见和证据将不胜感激。

如果您有好的版本/语法,欢迎编辑,如果您投反对票,请在评论下方留下您的结论。感谢丹尼斯的语法纠正。

【问题讨论】:

  • 我真的,真的建议你停止使用拖放。没有人使用它是有原因的——它是一种更慢、更不准确、更难维护的编写布局的方式。我认识的每个 iOS 工程师都希望他们有 Android 布局是有原因的——他们希望他们不必拖放。这也是严肃的网络开发人员不再使用 DreamWeaver 的原因。

标签: android android-constraintlayout


【解决方案1】:

与其他布局相比,约束布局是否昂贵?

取决于您的使用情况。 ConstraintLayout 就像类固醇上的 RelativeLayout

如果你想要一个简单的 2-3 ChildViews 布局,那么使用 ConstraintLayout 不会那么高效。选择线性布局。

ConstraintLayout 的主要目的是解决 RelativeLayout 的问题,它做得很好。你可以做很多用RelativeLayout。您可以前所未有地简化布局。此外,它还修复了 RelativeLayout 长期存在的性能问题。测量/布局阶段的双重征税 . 所以我们在一个漂亮的包中获得了更好的性能、更多的多功能性和更简单的布局。”

由于性能改进是创建此新布局的主要原因之一,因此我进行了一些性能测试以检查是否满足此目标。

我比较了 RecyclerView 中使用的布局。没什么太花哨的,只是一些嵌套的 LinearLayout 和 RelativeLayout 容器。我手动将此布局移至 ConstraintLayout 并进行了一些相当草率的性能测试。

在模拟器和 Nexus 5 上比较这两者会在使用新的 ConstraintLayout 时产生总体性能损失。

表现最差的是测量。 onMeasure() 方法所用的时间大约是我用于比较的 LinearLayout 方法的十倍。它占用了大部分时间,大约是onLayout() 的 60 倍。因此,与所讨论的 LinearLayout 相比,ConstraintLayout 的 onLayout() 方法的 30% 命中几乎是无关紧要的。最后,与使用 LinearLayout 相比,使用 ConstraintLayout 的布局膨胀花费的时间也更长

ConstraintLayout 做了很多计算来找出在哪里以及如何显示它的每个子元素。在内部(至少)三个相当长的类正在一起工作以获得结果:LinearSystemConstraintWidgetConstraintWidgetContainer。为了完全理解性能行为,我必须深入挖掘这些类的深度(为此,我更喜欢谷歌发布源代码时的注释类)。但是粗略地看一下反编译的代码,看起来这些类需要做很多事情。

一些烦恼

不过,目前并非所有设备都能完美运行。现在最困扰我的是这些:

  • 蓝图更改和设计预览之间存在明显滞后 变化
  • 预览并不总是正确的
  • 蓝图视图不注意文本布局约束
  • 约束并不总是按预期工作
  • 撤消操作非常不可靠

编辑器以意想不到的方式更新或更改内容

这个post 支持ConstraintLayout。

就我个人而言,当我想对齐超过 3 个视图时,我只使用 ConstraintLayout。它易于使用,但同时一开始很烦人。

tl:dr

【讨论】:

  • 这完全取决于您将其与什么进行比较以及您测量的内容。如果您将它与 LinearLayout 进行比较,它仍然要贵得多。如果您在内存使用方面进行比较,它比RelativeLayout 更昂贵。我也不会太相信随机的博客文章是准确的……好吧。尤其是那篇博文——所有的稻草人都将其与实施不佳的设计进行了比较。
  • @GabeSechan 我建议您发布它(更详细)作为支持用户的答案,这将通过谷歌搜索来到这里。
  • 如果您非常关心内存使用情况,请告诉我们它会影响多少内存。我没有阅读那个随机的博客。我自己使用过它,并在此基础上发布了这个答案。但我肯定会编辑这个答案。
  • 现在怎么样@Miller
  • @Dennis 对你的帖子有点困惑。你说它与其他人相比并不昂贵,然后一篇长文说它的性能较差。然后链接到一个帖子,告诉您始终使用它并且它的性能更高。
【解决方案2】:

约束布局提高了性能,阅读android开发者博客上的this文章,它明确指出,ConstraintLayout在测量/布局阶段的性能比RelativeLayout好约40%

【讨论】:

  • 示例中嵌套深度为4个ViewGroups,如果你的布局比较简单,那么没有太多需要使用约束布局。
  • 您使用什么工具来分析性能?
猜你喜欢
  • 2019-03-29
  • 2017-02-02
  • 1970-01-01
  • 2017-05-07
  • 2018-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-16
相关资源
最近更新 更多