如何在Flutter上实现高性能的动态模板渲染

本文探讨了在Flutter中实现高性能动态模板渲染所遇到的问题,分析了Flutter的布局、渲染机制,并介绍了通过自定义Widget、Element和RenderObject优化布局计算的方法,提升了长列表滑动的帧率。
摘要由CSDN通过智能技术生成

背景

最近小组在尝试使用集团DinamicX的DSL,通过动态模板下发,实现Flutter端的动态化模板渲染;本来以为只是DSL到Widget的简单映射和数据绑定,但实际跑起来的效果出乎意料的差,列表卡顿严重,帧率丢失严重。这就让我们不得不深入Flutter的Framework层,去了解Widget的创建、布局以及渲染的过程。

为什么Native可行方案在Flutter表现差?

在iOS和Android开发中,DSL到Native的方案其实并不陌生;Android中,我们就是通过编写XML文件来描述页面布局。Native的这种映射的方案,为什么在Flutter上,效果变得如此糟糕呢?

先通过一个简单的示例来看一下DinamicX_DSL的定义:

640?wx_fmt=png

可以看到DSL的设计与Android中的XML很相似,在我们的DSL中,每个节点的width和height属性,可以赋值两种特殊意义的值:match_parentmatch_content

在Flutter中,并没有 match_parentmatch_content的概念。最初我们的想法很简单,在Widget的build方法中,会递归计算。

表面上看,做好每个节点的宽高计算的缓存,虽然达不到一次性线性布局,这样的开销也并不是很大。但我们忽略掉了一个很重要的问题:Widget是immutable的,在Flutter中,Widget会被不断的创建销毁,这会导致布局计算非常的频繁。

要解决这些问题,单单处理Widget是不够的,需要Element以及RenderObject上做更多的处理,这也就是我们为什么要考虑自定义Widget的原因。

接下来通过源码来了解Flutter中Widget的build、layout以及paint相关的逻辑。

认识三棵树

我们通过一个简单的Widget—— Opacity来了解一下 WidgetElementRenderObject

Widget

在Flutter中,万物皆是Widget,Widget是immutable的,只是包含了视图的配置信息的描述,是非常轻量级的,创建和销毁的开销比较小。

Opacity继承自 RenderObjectWidget,其定义了两个比较关键的函数:

RenderObjectElement createElement();	
RenderObject createRenderObject(BuildContext context);

这正是我们要找的Element和RenderObject!这里只是定义了创建的逻辑,具体调用的时机我们继续往下看。

Element

在SingleChildRenderObjectWidget可以看到创建了 SingleChildRenderObjectElement对象。

Element是Widget的抽象,在Widget初始化的时候,调用Widget.createElement创建,Element持有Widget和RenderObject;BuildOwne

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值