Files
zealotchen c8908b38aa Feature/zealot2 doc 3.0 (#3296)
* docs(doc): update doc path

* docs(doc): update doc path

* docs(doc): update doc path

* docs(doc): update doc path

* docs(doc): update doc for 3.0

* docs(doc): update doc for 3.0

* docs(doc): update doc for 3.0

* docs(doc): update doc for 3.0

* docs(doc): update doc for 3.0

---------

Co-authored-by: OpenHippy <124017524+open-hippy@users.noreply.github.com>
2023-06-14 20:51:28 +08:00

8.7 KiB

Android Native Renderer


Flatten UI

Flatten UI是一种终端视图层级优化的方法,在Hippy 2.0的基础上实现这种优化方案,并不是简单的改造渲染逻辑就可以实现的,这里还依赖整体UI结构调整,缓存池改造,以及细粒度复用等重构完成后才能支持Flatten UI最终优化的实现,所以Flatten UI在3.0可以理解为一整套解决方案的升级,而不是单一的局部优化。

层级优化对比

在2.0中通过针对只参与排版的节点不创建实体view的方法来减少终端UI层级,在此基础上,3.0 Flatten UI采用子元素直接在父view上完成渲染的方法将UI层级进一步打平,通过下面这个demo我们可以看到不同阶段优化效果对比:

      <View onClick={...}>
         <View style={{margin: 10}}> 
               <Image {...} />
               <Text {...}>hello world</Text>
         </View>
      </View>

UI层级优化效果对比

  • 无层级优化情况下dom -> render -> view 一一对应
  • 2.0将只参与排版的节点在render中被优化,render节点和view一一对应
  • 3.0在2.0的基础上进一步优化view层级,部分子节点直接渲染在父节点的view上

UI 主体结构的改造

2.0 UI主体结构

2.0 UI主体结构

  • HippyViewGroup是我们页面中最常见的元素,但绝大部分view是不需要展示图片与处理图片属性的,从imageview派生出来让view组件变得异常臃肿;
  • AsyncImageView是HippyViewGroup的基类,也是属于Support-ui里面的一个基础组件,这个基类里面包括图片拉取管理,drawable的管理与渲染诸多逻辑,让组件渲染与view强耦合在一起,除了设计不合理以外代码实现质量也较差。
  • Support-ui目录下的所有组件逻辑未来会全部废弃。

3.0 UI主体结构

3.0 UI主体结构

  • 废弃 suppor-ui AsyncImageView,使用轻量化FlatViewGroup替代,FlatViewGroup只负责子节点渲染顺序的管理;
  • 通过新增Component体系实现view属性与渲染属性处理逻辑的分离;
  • Component由Render Node持有,负责Drawable的管理,可以在不依赖view的情况下完成独立渲染;
  • Image Component extends Component,主要包括image相关属性处理以及image loader对接逻辑。

缓存池改造

在2.0中只针对预创建view,base64与本地图片的数据做了缓存,既没有抽象出统一的缓存访问接口,也无法做很好的扩展来支持其它流程的缓存优化,所以在3.0定义了一套标准的缓存访问接口,重构了所有缓存相关的代码实现结构,并扩展了基于view的复用池与常用object的复用池。

  • PreCreateViewPool

    预创建view缓存池,当在dom线程接收到create node指令时,会创建对应的create render node task并放入队列中,等batch的时候把队列中的task放到UI线程批量执行,在此之前还需要执行排版相关的逻辑,为了让UI线程能提前处理一部分任务,当接收到create node指令时,就直接在UI线程创建对应的view并放到缓存池,等到UI 线程执行batch的时候就可以直接从缓存池取出使用,这样可以最大化UI线程和dom线程task的并行执行,减少整个流程的耗时该缓存池对于开发者来说是透明的,每次batch执行结束后就会清空,内部使用SparseArray的数据结构进行存储,直接使用view id做key

  • RecycleViewPool

    基于view type的view缓存池,主要使用在Recycler view滚动时候,recycler view item子view的回收,具体回收机制可以参考下一节细粒度复用的介绍该缓存池内部使用Map<String, SimplePool>进行存储,view的class name作为key值,每个类型的view pool default pool size为8

  • ImageDataPool

    Image data缓存池,该缓存池内部使用LruCache<Integer,ImageDataSupplier>进行存储,key值由image uri后32位做hashcode计算得出,当前设置的default pool size为24

  • RecycleObjectPool

    常用频繁创建对象的缓存池,类似于系统Message的使用,使用完成后做recycle,获取的时候直接obtain from pool,避免临时对象的频繁创建和销毁带来GC问题,该缓存池内部使用Map<CustomObjectType, SimplePool