React Native 渲染器利用核心渲染实现跨平台共享。
在之前的 React Native 渲染系统中,React Shadow Tree、布局逻辑、View Flattening 算法每个平台都实现了一次。 当前的渲染器通过共享核心 C++ 实现从而变为了一个跨平台解决方案。
React Native 团队打算将动画系统整合到渲染系统中,并将 React Native 渲染系统扩展到 Windows 等新平台,以及游戏机、电视等的操作系统。
将 C++ 用于核心渲染系统引入了几个优点。 单一实现降低了开发和维护成本。它提高了创建 React Shadow 树和布局计算的性能,因为在 Android 上将 Yoga 与渲染器集成的开销最小化(即,不再有用于 Yoga 的 JNI)。最终,每个 React Shadow Node 在 C++ 中的内存占用比从 Kotlin 或 Swift 分配的要小。
JNI(Java Native Interface)注:用于编写 Java 原生方法的 API,用于在 Fabric 的 C++ 核心和 Android 之间进行通信,用 Java 编写。
该团队还利用了强制不可变性的c++特性,以确保对共享但不受保护的资源的并发访问不会出现问题。
重要的是要认识到,Android 的渲染器用例仍然会在两个主要用例中产生 JNI 成本:
-
复杂视图(例如 Text、TextInput 等)的布局计算需要通过 JNI 发送 props。
-
挂载阶段需要通过 JNI 发送修改操作。
该团队正在探索用一种新机制替换 ReadableMap,以使用 ByteBuffer 序列化数据以减少 JNI 的开销。 我们的目标是将 JNI 的开销减少 35-50%。
渲染器提供了其 C++ API 的两个方面:
-
(i) 与 React 通信
-
(ii) 与主机平台通信
对于 (i),React 与渲染器通信以渲染 React 树并“监听”事件(例如 onLayout、onKeyPress、触摸等)。
对于 (ii),React Native 渲染器与宿主平台通信以在屏幕上挂载宿主视图(创建、插入、更新或删除宿主视图),并监听用户在宿主平台上生成的事件。
