视图扁平化
本文档涉及正在积极推广的新架构。
视图扁平化是 React Native 渲染器的一种优化,用于避免深度布局树。
React API 旨在通过组合实现声明式和可重用。这为直观的开发提供了一个很好的模型。但是,在实现中,API 的这些特性会导致创建深度React 元素树,其中绝大多数 React 元素节点仅影响视图的布局,并且不会在屏幕上渲染任何内容。我们将这些类型的节点称为“仅布局”节点。
从概念上讲,React 元素树的每个节点都与屏幕上的一个视图具有 1:1 的关系,因此渲染由大量“仅布局”节点组成的深度 React 元素树会导致渲染期间性能下降。
以下是一个受“仅布局”视图成本影响的常见用例。
假设您想渲染一个图像和一个由TitleComponent
处理的标题,并且您将此组件作为具有某些边距样式的ContainerComponent
的子组件包含在内。分解组件后,React 代码将如下所示
function MyComponent() {
return (
<View> // ReactAppComponent
<View style={{margin: 10}} /> // ContainerComponent
<View style={{margin: 10}}> // TitleComponent
<Image {...} />
<Text {...}>This is a title</Text>
</View>
</View>
</View>
);
}
作为渲染过程的一部分,React Native 将生成以下树
请注意,视图 (2) 和 (3) 是“仅布局”视图,因为它们渲染在屏幕上,但它们仅在其子元素之上渲染10 px
的margin
。
为了提高这些类型的 React 元素树的性能,渲染器实现了一种视图扁平化机制,该机制合并或扁平化这些类型的节点,从而减少渲染到屏幕上的宿主视图层次结构的深度。此算法考虑了诸如:margin
、padding
、backgroundColor
、opacity
等属性。
视图扁平化算法在设计上被集成到渲染器的差异化阶段,这意味着我们不使用额外的 CPU 周期来优化 React 元素树扁平化这些类型的视图。与其他核心功能一样,视图扁平化算法在 C++ 中实现,并且其优势默认在所有支持的平台上共享。
在前面的示例中,视图 (2) 和 (3) 将作为“差异化算法”的一部分被扁平化,因此它们的样式将合并到视图 (1) 中。
需要注意的是,此优化允许渲染器避免创建和渲染两个宿主视图。从用户的角度来看,屏幕上没有可见的变化。