当前位置: 首页 > news >正文

外贸生意做哪个网站好微站图片

外贸生意做哪个网站好,微站图片,国际新闻 军事,拉新app开发1. MTFlexbox MTFlexbox是美团内部应用的非常成熟的一种跨平台动态化解决方案#xff0c;它遵循了CSS3中提出的Flexbox规范来抹平多平台的差异。MTFlexbox适用于重展示、轻交互的业务场景#xff0c;与现有HTML、React Native、Weex等跨平台方案相比#xff0c;MTFlexbox具备… 1. MTFlexbox MTFlexbox是美团内部应用的非常成熟的一种跨平台动态化解决方案它遵循了CSS3中提出的Flexbox规范来抹平多平台的差异。MTFlexbox适用于重展示、轻交互的业务场景与现有HTML、React Native、Weex等跨平台方案相比MTFlexbox具备着性能高、渲染速度快、兼容性高、原生功能支持度高等优势。但其缺点在于不支持复杂的交互逻辑不适合复杂交互的业务场景。目前MTFlexbox已经广泛应用在美团首页、搜索、外卖等重要业务场景。本文主要介绍在MTFlexbox中使用Litho优化性能的实践经验。 1.1 MTFlexbox的原理 MTFlexbox首先定义一份跨平台统一的DSL布局描述文件前端通过“所见即所得”的编辑器编辑产生布局客户端下载布局文件后根据布局中的描述绑定JSON数据并最终完成视图的渲染。MTFlexbox框架图如下图所示 图中分为五层分别是 业务应用层业务使用MTFlexbox的编辑器定义符合Flexbox规范的DSL文件XML模版。模版下载负责XML模版下载相关的工作包括模版缓存、预加载和异常监控等。模版解析负责模版解析相关的工作包括标签节点的预处理、数据绑定、标签节点的缓存复用和数据异常监控等。视图渲染负责视图渲染相关的工作包括把标签结点按照Flexbox规范解析成Native视图并完成视图属性的设置、点击曝光事件的处理、视图渲染、异常监控等。自定义标签扩展提供支持业务扩展自定义标签的能力。鉴于本篇博客主要涉及渲染相关的内容下面将着重介绍MTFlexbox从模版解析到渲染的过程。如下图所示MTFlexbox首先会把XML模版解析成Java中的标签树然后和JSON数据绑定结合成一颗具有完整数据信息的节点树。至此模版解析工作就完成了。解析完成的节点树会交给视图引擎进行Native视图树的创建和渲染。 2. MTFlexbox在美团动态化实践中面临的挑战 随着MTFlexbox在美团内部被广泛使用我们遇到了两个问题 复杂视图因层级过深导致滑动卡顿问题。生成视图耗时过长导致滑动卡顿问题。2.1 问题一视图层级过深 2.1.1 原因分析 MTFlexbox使用的是Flexbox布局Flexbox布局可以理解成Android LinearLayout布局的一种扩展。Flexbox在布局过程中使用到大量的布局嵌套如果布局酷炫复杂无疑会出现布局层级过深、视图树遍历耗时、绘制耗时等问题最终引发滑动卡顿。下图是美团正在使用的一个模版的视图层级情况布局最深处有8层 2.1.2 影响 布局层级过深在布局的计算和渲染过程中会导致过多的递归调用影响视图的绘制效率引发页面滑动FPS下降问题这会直接影响到用户体验。 2.2 问题二生成视图耗时过长 2.2.1 原因分析 视图生成耗时原因如下图所示RecyclerView在使用MTFlexbox布局条目时需要对条目模版进行下载并解析生成节点树这样会导致生成视图的过程耗时过长。为了提高视图生成速度我们增加了复用机制但是滑动过程中如果遇到新的布局样式仍然需要重新下载和解析。另外MTFlexbox绑定的数据是未经解析的JSON字符串所以也要比正常情况下的数据绑定更耗时一些。 正是上面两个原因导致了MTFlexbox生成视图耗时过长的问题这也会导致滑动时FPS出现突然下降的现象产生卡顿感。 2.2.2 影响 由于视图的创建会阻塞主线程创建视图耗时过长会导致RecyclerView列表滑动时卡顿感明显也严重影响到了用户体验。 3. Litho 3.1 Litho原理 Litho是一套声明式UI框架或者说是一个渲染引擎它主要优化复杂RecyclerView列表的滑动性能问题。Litho实现了视图的细粒度复用、异步计算布局和扁平化视图可以显著提升滑动性能减少RecyclerView滑动时的内存占用。详细介绍可以参考美团技术团队之前发布的另一篇博客Litho的使用及原理剖析。 3.2 Litho的优势 通过对Litho原理的了解我们可以看到Litho主要针对RecyclerView复杂滑动列表做了以下几点优化 视图的细粒度复用可以减少一定程度的内存占用。异步计算布局把测量和布局放到异步线程进行。扁平化视图把复杂的布局拍成极致的扁平效果优化复杂列表滑动时由布局计算导致的卡顿问题。扁平化视图刚好可以优化MTFlexbox遇到的视图层级过深的问题。异步计算布局虽然不能直接解决MTFlexbox生成视图耗时过长问题但是给问题的解决提供了新的思路——异步提前完成视图创建。而且使用Litho还能带来一定程度的内存优化。所以如何将Litho应用到MTFlexbox中进而来解决MTFlexbox现存的问题是我们解下来要讨论的重点。 4. Litho MTFlexbox是怎么解决上述两个问题的 4.1 解决问题一视图层级过深问题 Litho实现了布局的扁平化所以最直接的方式就是使用Litho来替换MTFlexbox现有的视图引擎。视图引擎最主要的作用是把XML文件解析出来的节点树变成Litho可以展示的视图所以视图引擎替换的主要工作是把节点树转换成Litho能展示的视图。如下图所示。由于Litho使用的是组件化思想需要先把节点转化成组件再把组件树设置给LithoView而LithoView是Litho用于兼容原生View的容器它负责把Litho和系统视图引擎桥接起来。 不过视图引擎的替换并不是一帆风顺的我们在替换过程中也遇到了4个比较大的挑战。 难点一复用视图无法更新数据问题 问题描述完成了节点树到组件树的转化以后我们发现了一个严重的问题——复用的视图无法应用新的数据。 问题分析当数据发生变化后MTFlexbox的节点树会对比新旧数据的变更确定哪些结点需要更新并通知到具体的视图节点然后更新显示内容例如新数据相比旧数据改变了Text那么只有Text对应的节点会通知对应的视图去更新内容。Litho组件的Prop属性是不允许更改的而Litho组件中绝大多数属性都是Prop属性。 解决方案 方案一使用State属性全局替换所有组件的Prop属性。这种方式的优点在于替换方式相对简单直接缺点是侵入性强替换工作量巨大且不符合Litho的思想尽可能少的去改变组件的状态。这种方案不是最优解我们要降低侵入简单快捷地实现数据更新于是就产生了方案二具体如下图所示。 方案二封装一套Updater组件用于创建真正展示的组件。Updater组通过State属性监听对应节点的数据变更当节点数据变化时可以触发对应节点的更新。 但在后来的实践过程中我们发现Litho整个组件树中只要有一个组件有状态更新便会重新计算整个布局而每次数据更新少说也会有几十个节点发生变化。频繁的重复计算反而导致性能变得很差。在经过了多种尝试以后我们找到了最优的解决方案 如上图所示状态更新控制器负责整个视图所有节点的更新操作。在所有数据都更新完成以后统一交由状态更新控制器触发一遍组件更新。 难点二Litho不支持层叠布局问题 MTFlexbox并没有完全严格的使用Flexbox布局规范为了简单实现层叠效果MTFlexbox自定义了一种新布局规范——Layer布局。Layer布局具有以下两个特点 特点一Layer的子视图在z轴上依次层叠展示。特点二Layer的子视图默认且只能充满父布局。原因分析 由于Litho严格遵守Flexbox布局规范所以没有现成的Layer组件。 解决方案 自己实现Layer组件满足第一个特点很容易Flexbox本身就支持层叠展示只需要把子视图设为绝对布局就可以了。但是让子视图默认充满父布局就没有那么简单了Flexbox布局中没有任何一个属性可以达到这个效果。在经过了若干次组合多个属性的尝试以后还是没能找到解决方案。既然Layer并不是Flexbox布局的规范那么我们局限在Flexbox的束缚下怕是很难找到完美的解决方案。那么能不能在Litho中绕过Flexbox的约束自己实现Layer效果呢想在Litho中突破Flexbox布局的束缚就需要了解Litho是如何使用Flexbox的。 如上图Litho的Flexbox布局是由Yoga负责布局计算的。每一个Litho组件都会对应一个Yoga节点。但Yoga的布局计算过程是由根节点去统一触发的子节点没有办法知道自己对应的Yoga节点是何时开始计算及何时计算结束。这样以来我们就没有时机去感知到Layer组件的布局是否计算完成也就没有办法在Layer组件计算完成后去控制Layer子节点的计算。为了解决这个问题我们做了两件事 添加布局计算完成的回调在布局计算完成后由根节点逐层通知子节点计算完成的消息。拆分Yoga节点树由Layer自己来控制子节点的计算。 如上图所示把Layer组件伪造成叶子节点不把Layer组件的子节点设置给Yoga这样一个Yoga中的布局树就被Layer组件切割开了。当根节点计算完成以后通知到Layer组件Layer组件再依次去设置子节点的宽高和位置属性并触发子节点去完成各自子节点的布局计算。这样就完美地实现了Layer的布局效果。 难点三Litho图片组件不支持使用网络图片问题 原因分析 Litho的组件是一个属性的集合Litho期望我们在组件创建时便确定了所有属性的值所以Litho不支持网络图的展示。如果要支持从网络下载图片就意味着图片组件用来展示的内容会发生变化。所以Litho自带的图片组件并不支持使用网络图片。 解决方案 方案一用State属性解决网络图片下载带来的展示内容变化问题。我们在实践中发现State属性的更新会导致整个布局重新计算其实替换图片资源不会导致图片组件的大小位置发生变化根本不需要重新计算布局。为了减少使用State属性导致布局计算频繁的问题就摒弃了这种方案。 方案二Litho官方额外提供的异步下载图片组件FrescoImage中使用的是图片代理方式。FrescoImage使用DraweeDrawable来绘制视图而DraweeDrawable实际上并不具备图片渲染的能力只是在内部保存了一个真正的Drawable来负责渲染。所以DraweeDrawable本质上是对真正要展示的图片做了一层代理当从网络上下载下来真正要展示的图片后只需要通过替换代理图片就可以完成视图的更新。美团下载图片使用的是Glide只需要按照这个思路实现自己的GlideDrawable就好了。 难点四自定义标签扩展的接口不兼容问题 MTFlexbox支持自定义标签的扩展所以我们在完成基本视图标签的Litho实现以后还需要支持自定义Tag的扩展才算完成视图引擎的替换工作。 原因分析 MTFlexbox在设计自定义标签接口时只提供了允许使用View完成视图扩展的接口但是Litho实现的视图引擎是使用组件作为视图单元和MTFlexbox对接的所以接口不能兼容。 解决方案 方案一重新提供使用Litho组件完成视图扩展的接口。其缺点是需要MTFlexbox的使用方重新实现已经支持了的自定义标签工作量较大所以这种方案被抛弃了。 方案二Litho中使用业务方已经扩展好的View。其优点是使用方对视图引擎的替换无感知。那么怎样才能在Litho中使用业务方已经扩展好的View呢可以先看下面这张图。 我们可以简单的理解成Litho对Android的View做了一个功能拆分把属性和布局计算的能力放在了组件里面每一种组件对应一个绘制单元来专门负责绘制。那么对于使用方扩展的标签我们可以定义一个通用组件来统一承接。在挂载绘制单元时再去调用使用方扩展的视图去绘制。 优化效果 至此视图引擎的替换就完成了整个视图引擎的替换做到了使用方无感知。完美解决了MTFlexbox视图层级深的问题顺带还优化了部分性能。下面是布局层级优化效果的对比可以看到相同样式下使用Litho引擎实现的视图比使用MTFlexbox原生引擎的视图层级要浅很多。 除此之外还有我们的内存优化成果。下图是美团首页使用MTFlexbox时内存占用随滑动页数一页为20条数据增加而变化的趋势图。可以看到使用Litho引擎实现的MTFlexbox比使用原生引擎的MTFlexbox在内存占用上能有30M以上的优化。 4.2 解决问题二生成视图耗时过长 上文提到导致生成视图耗时过长的有两个原因 (1) MTFlexbox对布局模版的下载和解析耗时。 (2) MTFlexbox绑定时解析数据的耗时。 上文“自定义标签扩展的接口不兼容问题”中介绍过Litho的组件能够独立完成布局计算。另外Litho组件是轻量级的所以我们直接把Litho组件作为RecyclerView适配器的数据源。这样就需要在数据解析时提前完成组件的创建而组件的创建需要用到MTFlexbox的整个解析过程也就是说我们把MTFlexbox导致视图生成耗时过长的过程提前在数据层异步完成了。这样就不需要等到视图要展示时再去解析从而规避了视图生成耗时过长的问题。具体的原理可以参见Litho的使用及原理剖析一文中的3.2节“异步布局”。 如上图所示在异步线程中提前完成MTFlexbox布局到Litho组件的转换。当视图真正要展示时只需要把组件设置给LithoView就可以了。 优化效果 使用Litho引擎实现的滑动列表在连续滑动过程中不会出现FPS波动问题而使用MTFlexbox原生引擎实现的滑动列表则波动明显。数据采集自魅蓝2手机中低端手机优化效果明显 5. 总结 经过一段时间的实践Litho MTFlexbox给美团App在性能指标上带来了较大的提升。但是还有很多问题待完善我们后续还会针对以下几点进一步提升效果 利用Litho组件属性不可变的特点将提前异步布局进一步扩展为提前渲染出位图在绘制时直接展示位图可以进一步提升绘制效率。优化RecyclerView相关的API降低侵入性。解决有点击事件、埋点事件等属性的视图需要降级成View才能使功能生效的问题进一步优化视图层级。6.参考资料 Litho官网 Flexbox规范 7. 作者简介 少宽、腾飞、叶梓美团终端业务研发团队开发工程师。 8. 招聘信息 美团终端业务研发团队的职责是保障平台业务高效、稳定迭代的同时持续优化用户体验和研发效率。团队负责的业务主要包括美团首页、美团搜索等千万级DAU高频业务以及分享、账号、音/视频等基础业务支撑和对接外卖、酒店等30多个业务方。 团队通过动态化能力建设加快业务上线速度帮助产品团队快速验证业务选型做出业务决策通过架构/服务标准化体系建设提升前后端以及平台与业务线的沟通、合作效率业务监控和体验优化有效保障核心业务服务成功率的同时提升用户使用美团App过程中的稳定性和流畅性。团队开发技术栈包括Android、iOS、ReactNative、Flexbox等。 美团终端业务研发团队现诚聘Android、iOS工程师欢迎有兴趣的同学投简历至techmeituan.com注明美团终端业务研发团队。
http://www.pierceye.com/news/33746/

相关文章:

  • 织梦如何做网站留言功能做网站需要交钱吗
  • 宁波做网站制作哈尔滨模板建站品牌
  • 男人和女人做不可描述的事情的网站网站刷流量会怎么样
  • php企业网站跨境电商主要平台有哪些
  • 如何提高景区旅游网站建设做网站需要的流程
  • 网站制作多少费用php7与WordPress
  • 郑州网站关键词优化公司长春做网站选长春万网
  • 全球军事网站网站的基本概念
  • 山西建站推广登录qq网页版
  • 百度网盘app手机版模版网站如何优化
  • 建设网站需要的软硬件网站服务器ip地址在哪里看
  • 纺织行业网站怎么做吸引人个人网站备案不能盈利
  • ps做分享类网站效果图凡科建站电话
  • wordpress时间中文大庆网站建设优化
  • 纯js做网站三亚百度推广开户
  • 做食品网站用什么颜色网站开发后台
  • php开源网站管理系统如何做局域网网站建设
  • 网站设计用ps 怎么做中核集团电子商城
  • 如何做网站更新营销策略分析
  • 郑州响应式建站wordpress前台增加编辑
  • 孝感个人网站建设重庆智慧团建网站登录平台
  • 网站设计是干什么的高清不卡二卡三卡四卡免费下载
  • 筑巢网站建设网站建设买了服务器后怎么做
  • 网站建设要学哪些软件有哪些抖音seo系统
  • 电子系网站建设方案营销广告网站
  • 网站建设电子商务课总结和体会小程序的模板
  • 郑州网站优化公司新媒体运营需要学什么
  • 如何评价企业网站推广效果?保险公司销售好做吗
  • 360免费建站怎么样手机系统优化工具
  • 做效果图常用的网站单页面网站有哪些内容