自渲染跨端框架在字节跳动的实践与展望

如果无法正常显示,请先停止浏览器的去广告插件。
分享至:
1. 自渲染跨端框架在字节跳动 的实践与展望 刘国良 字节跳动 – 客户端开发工程师
2. 目录 01 背景 02 实现原理 03 Android 同步渲染 04 业务应用 05 未来展望
3.
4. 背景
5. Lynx 介绍 01 前端友好 支持小程序和 React 等多种 DSL;支持常用的 CSS 样式 及布局模型 02 Lynx 03 高性能 使用平台原生组件;C++ 数据驱动;支持首屏直出 开发体验 提供一系列工具来提升开发和调试体验,例如 VSCode 插 件、远程调试、Web Playground、页面录制等
6. Lynx 示例
7. Lynx 解决的问题 Native • 多端投入,开发成本高 Lynx • 无动态更新能力 • 前端的开发体验 • 开发效率较低 • 接近 Native 的性能 • 跨 Android/iOS 平台 • 支持业务动态更新 • 高效支持卡片场景 Web • 性能和体验跟 Native 有差距 • 与 Native 互操作性低
8. Lynx 存在的问题 性能 跨平台 一致性 在电视盒子这样的低端设备上对 跨平台需求场景扩展到了PC端/电 大部分逻辑下沉到 C++,已经能 性能有更高的要求 视大屏/嵌入式设备等各种场景 很大程度上解决跨端一致性的问 题,但组件还是分端实现,仍然 有较高的多端适配成本 自渲染 • 更精简的 UI 框架 • 能以较低的成本支持新的平台 • Android 端减少 JNI 调用 • 功能特性天然跨平台 • Paragraph 复用 • 业务场景针对性优化 • 各端的能力与表现高度一致, 降低业务适配、测试成本 • 不受平台 UI 框架限制,能更 贴近 Web 端
9. 实现原理
10. 实现原理 站在巨人的肩膀上 Engine 全平台支持 渲染管线精简 成熟稳定
11. 实现原理 Lynx 整体架构 Bundle Resources Parser JS Bridge Components Animation Android Customize ... DSL CSS Diff/NoDiff Components Painting iOS Layout Painting fml Android Tools UI Libs VM JS Framework Compositing Embedder iOS Windows Animation Skia macOS ...
12. 实现原理 自渲染架构 view list text refresh-view Painting LynxModule fml image Animation DevTool Shell Android scroll-view svg lottie Gesture Monitor Flow iOS input video canvas FocusManager Log overlay … Resources Player Network Skia txt … Windows macOS ...
13. 实现原理 渲染流程 Data change template data VDOM DOM API Animation element tree view tree render tree Raster Animation layer tree screen
14. 实现原理 线程模型 Main Lynx 线程模型 Renderkit 线程模型 Tasm JS Data update Layout JS UI Platform Raster Diff Layout Patch Paint Rasterize UI Raster IO IO image SwapBuffer
15. 自渲染方案对比 Lynx 自渲染 Flutter Skyline 开发语言 小程序/React Dart 小程序 布局模型 W3C Custom W3C 布局性能 中 高 中 渲染引擎 Skia 渲染性能 理论上相当 包体积(Android) ~5M ~5M ? 动态更新 支持 不支持 支持 接入方式 页面、卡片 页面、应用 页面、小程序
16. Android 同步渲染
17. 同步渲染 背景 SurfaceView • 单独线程绘制,与原生渲染不同步, 快速滑动会产生黑块/错乱 • 滑动过程中 Surface 会销毁重建, 开销较大 TextureView • 与平台侧 View 一起上屏,但存在 延迟,快速滑动会有空白 • 内存占用高 渲染不同步 内存占用高
18. 同步渲染 Android WebView 中的 Draw functor 机制 UI Thread Render Thread Input Animate Measure Layout Draw Sync ops Clip Fill Functor … Sync ops Optimize Execute Clip Fill Functor …
19. 同步渲染 实现方案 原 SurfaceView 模式 UI • 渲染不同步 • Surface 创建/销毁 • Buffer 内存占用 Draw Paint LayerTree 模式 UI Paint • 不支持裁剪绘制指令 Draw LayerTree Render Flush Raster Paint Raster • 额外的录制过程 • 无 GPU RasterCache • 不支持裁剪绘制指令 Draw Render Flush Functor Record Flush Functor Swap Raster Raster Swap SkPicture 模式 UI Render Swap SkPicture Swap Texture 模式 • 共享纹理机制复杂 • 额外的纹理内存 UI Paint Draw Render Raster Flush Functor Raster Texture Swap
20. 同步渲染 效果 LayerTree 模式 Texture 模式 • 卡片场景下滑动不产生黑块 • 能支持 partial repaint 裁剪绘制指令 • 避免 Surface 创建/销毁耗时,首屏 耗时减少约 20% • 由于多一个纹理保存绘制结果,内存 收益会减少 • 减少 SurfaceView 双缓冲/三缓冲的 内存占用(1080p 下减少 16~24M) • 由于不能裁剪绘制指令,动画性能有 一定下降
21. 业务应用
22. 业务应用 自渲染支持能力 框架能力 • 继承绝大部分 Lynx 能力,例如 DSL、 NativeModule、 SelectorQuery 等 组件 • 支持所有基本组件: view, image, text, scroll-view, swiper, … CSS • 支持大部分进阶组件: 样式上支持绝大部分 Lynx 的 CSS 样式,但是 list, canvas, lottie, audio, video, … 可以做到多端渲染完全一 致 • • • 布局上由于直接使用 Lynx 布局结果,所以目 前与 Lynx 原生完全一致 不存在多端逻辑不一 致问题 特有能力 • 支持鼠标、按键事件, 支持焦点系统 • 扩展了一些桌面端使用 的组件
23. 业务应用 Android TV 端应用 鲜时光活动页 鲜时光搜索页 活动页相比 H5 版本首屏耗时降低 60%+, 搜索页性能和业务数据与 Native 版本 业务数据显著提升 持平,赋予页面动态化能力
24. 业务应用 桌面端应用 剪映活动、发票、会员页 TikTok LIVE Studio 主界面 嵌入在 QT 应用中,提高开发效率和开 嵌入在 Electron 应用中,复用移动端 发体验,提供动态化能力 代码,提高一致性
25. 未来展望
26. 未来展望 替换 Skia? Skia 问题 • 包体积较大 • 历史包袱 • 着色器 Jank 问题 自研引擎 or Impeller
27. 未来展望 更多平台支持 嵌入式 Linux XR 性能、内存面临更高的要求 系统碎片化 新的交互形态、3D 场景 (WebGL/WebGPU)、高帧 率低延时
28. 扫码回复「D2」 获取第十七届 D2 演讲 PDF 材料 后续也将推送 D2 会后技术文章,敬请关注!!
29. 感谢大家观看

首页 - Wiki
Copyright © 2011-2024 iteam. Current version is 2.124.0. UTC+08:00, 2024-05-02 09:06
浙ICP备14020137号-1 $访客地图$