DanceUI 原理-如何设计一个 iOS 平台的声明式 UI 框架
如果无法正常显示,请先停止浏览器的去广告插件。
1. DanceUI 原理
-如何设计一个 iOS 平台上的声明式 UI 框架
陈奕
字节跳动-抖音基础技术-研发工程师
2. 目录
01 DanceUI 介绍
02 DanceUI 实现原理
03 业务实践
3.
4. DanceUI 介绍
5. DanceUI 介绍
声明式 UI
DanceUI
是什么
SwiftUI
生态兼容
6. DanceUI 介绍 —声明式 UI
在 iOS 上使用 UIKit 实现一个列表页的场景
7. DanceUI 介绍 —声明式 UI
在 iOS 上使用 UIKit 实现一个列表页的场景
8. DanceUI 介绍 —声明式 UI
在 iOS 上使用 UIKit 实现一个列表页的场景
9. DanceUI 介绍 —声明式 UI
在 iOS 上使用 UIKit 实现一个列表页的场景
10. DanceUI 介绍 —声明式 UI
在 iOS 上使用 UIKit 实现一个列表页的场景
11. DanceUI 介绍 —声明式 UI
iOS 上的声明式 UI —— SwiftUI
1. 直观简洁,所见即所得
2. 数据绑定,逻辑清晰
3. 代码可读性高,维护成本低
12. DanceUI 介绍 —声明式 UI
13. DanceUI 介绍 —声明式 UI
iOS 上的声明式 UI —— SwiftUI
1. 版本限制,仅支持 iOS 13 以上
2. Bug 修复依赖系统版本发布
3. 版本差异大,接入成本高
局限性
14. DanceUI 介绍 —DanceUI 是什么
DanceUI 是由抖音基础技术团队研发的一个 iOS 平台上的声明式 UI 框架
1. 向下兼容到 iOS 10
2. 与 SwiftUI 的语法和接口完全一致
3. 能力对齐 SwiftUI
4. 版本一致性
15. DanceUI 介绍
声明式 UI
DanceUI
是什么
SwiftUI
生态兼容
16. DanceUI 介绍 — SwiftUI 生态兼容
占位效果可以用 SwiftUI 社区的Shimmer 组件来实现
17. DanceUI 介绍 — SwiftUI 生态兼容
占位效果可以用 SwiftUI 社区的Shimmer 组件来实现
18. DanceUI 介绍 — SwiftUI 生态兼容
占位效果可以用 SwiftUI 社区的Shimmer 组件来实现
19. DanceUI 介绍 — SwiftUI 生态兼容
占位效果可以用 SwiftUI 社区的Shimmer 组件来实现
20. DanceUI 介绍 — SwiftUI 生态兼容
占位效果可以用 SwiftUI 社区的Shimmer 组件来实现
21. DanceUI 介绍 — SwiftUI 生态兼容
占位效果可以用 SwiftUI 社区的Shimmer 组件来实现
22. DanceUI 介绍 — SwiftUI 生态兼容
占位效果可以用 SwiftUI 社区的Shimmer 组件来实现
23. DanceUI 介绍 — SwiftUI 生态兼容
DanceUI 不支持的能力
1. 基于系统高版本 UIView 实现的组件
2. 最新版本 SwiftUI 新增能力,持续开发并向下兼容
24. DanceUI 介绍 — SwiftUI 生态兼容
DanceUI 实现 SwiftUI lab 上项目的炫酷效果
25. DanceUI 介绍 — SwiftUI 生态兼容
DanceUI 能力拓展 —— PinchToZoom
26. DanceUI 实现原
理
27. DanceUI 实现原理 — 架构分层
业务视图
计算引擎 (有向无环图)
渲染引擎
宿主容器
计算节点
渲染树
28. DanceUI 实现原理 — 上屏流程
DanceUI 通过将「业务视图」送入「宿主容器」,创建对应的「计算引擎」
,完成视图内容计算,输出渲染树 UI 的渲染。
UIHostingController
业务视图
计算引擎
渲染上屏
渲染树
29. DanceUI 实现原理 — 上屏流程
Hello,world 的示例
30. DanceUI 实现原理 — 上屏流程
Hello,world 的示例
External<ContentView>
External<_SafeAreaInsetsModifier>
External<ViewOrigin>
StaticBody<ViewBodyAccessor<ContentView>>
External<ViewSize>
ResolvedTextFilter
RootGeometry
StyledTextLayoutComputer
StyledTextChildGeometry
View
LayoutPositionQuery
size
position
containerPosition
创建计算节点(内容、几何体位置、遮罩、混合模式……)
视图计算
LeafDisplayList<StyledTextContentView>
渲染树
31. DanceUI 实现原理 — 更新机制
当视图内容的数据源发生变化时 ,计算引擎的计算流程会被再次触发。
完成状态更新后的渲染上屏。
32. DanceUI 实现原理 — 更新机制
DanceUI 状态更新示例
33. DanceUI 实现原理 — 更新机制
DanceUI 状态更新示例
34. DanceUI 实现原理 — 更新机制
DanceUI 状态更新示例
External<ContentView>
External<()>
External<_SafeAreaInsetsModifier>
External<ViewOrigin>
DynamicBody<ViewBodyAccessor<ContentView>>
StaticBody<ViewBodyAccessor<ContentView>>
External<ViewSize>
ResolvedTextFilter
RootGeometry
StyledTextLayoutComputer
StyledTextChildGeometry
View
LayoutPositionQuery
size
position
containerPosition
LeafDisplayList<StyledTextContentView>
渲染树
35. DanceUI 实现原理 — 更新机制
DanceUI 状态更新示例
External<ContentView>
External<()>
External<_SafeAreaInsetsModifier>
External<ViewOrigin>
DynamicBody<ViewBodyAccessor<ContentView>>
StaticBody<ViewBodyAccessor<ContentView>>
External<ViewSize>
ResolvedTextFilter
RootGeometry
StyledTextLayoutComputer
StyledTextChildGeometry
View
LayoutPositionQuery
size
position
containerPosition
LeafDisplayList<StyledTextContentView>
触发新状态的视图计算
数据源发生变化
渲染树
渲染树
36. DanceUI 实现原理 — 更新机制
DanceUI 更新机制中的特点 & 优化
External<ContentView>
1. 计算流程的按需更新
External<()>
External<_SafeAreaInsetsModifier>
External<ViewOrigin>
StaticBody<ViewBodyAccessor<ContentView>>
DynamicBody<ViewBodyAccessor<ContentView>>
External<ViewSize>
ResolvedTextFilter
RootGeometry
StyledTextLayoutComputer
StyledTextChildGeometry
View
LayoutPositionQuery
size
position
containerPosition
LeafDisplayList<StyledTextContentView>
渲染树
渲染树
37. DanceUI 实现原理 — 更新机制
DanceUI 更新机制中的特点 & 优化
1. 计算流程的按需更新
2. 事务进行提交更新
38. DanceUI 实现原理 — 更新机制
DanceUI 更新机制中的特点 & 优化
1. 计算流程的按需更新
State-0
State-1
Attribute-3
2. 事务进行提交更新
Attribute-0
Attribute-1
3. 计算节点不进行重复计算
Attribute-2
render tree
渲染树
39. 业务实践
40. DanceUI 业务实践
DanceUI 在字节跳动的多个产品落地
41. DanceUI 业务实践
DanceUI 在字节跳动的多个产品落地
滤镜多列表协同滚动场景
42. DanceUI 业务实践
DanceUI 在字节跳动的多个产品落地
滤镜多列表协同滚动场景
新业务使用
43. DanceUI 业务实践
DanceUI 在业务上与 UIKit 进行 AB 实验
• 研发效率
• 性能
• 业务指标
44. DanceUI 业务实践
DanceUI 在业务上与 UIKit 进行 AB 实验
• 研发效率
开发周期(投入人日):大约减少 30% 的开发人天数
代码规模:DanceUI 与 UIKit 相比,代码量大约减小 30%
Preview 实时预览: Preview 耗时 20+s,UIKit 增量编译 1分半钟-2分钟
• 性能
• 业务指标
45. DanceUI 业务实践
DanceUI 在业务上与 UIKit 进行 AB 实验
• 研发效率
• 性能
流畅度:DanceUI 与 UIKit 持平
内存/CPU 占用:DanceUI 相比 UIKit 有一定优化
UIKit 组件复用:DanceUI 中复用 UIKit 组件几乎没有性能损耗
• 业务指标
46. DanceUI 业务实践
DanceUI 在业务上与 UIKit 进行 AB 实验
• 研发效率
• 性能
• 业务指标
DanceUI 与 UIKit 线上业务核心指标数据打平
47. DanceUI 业务实践
DanceUI 相比于其他声明式 UI 框架(自研)
• 优势
框架本身投入成本:文档、学习成本、社区生态建设
性能:DanceUI 性能优势
业务指标:DanceUI 的业务指标与 UIKit 数据打平
• 劣势
暂不支持跨端的能力
iOS 独有,不太适合其他的平台的开发者
48. DanceUI 业务实践
DanceUI 和 SwiftUI 相比
• 优势
研发效率、性能 SwiftUI 一致
社区生态兼容,没有额外学习成本
向下兼容、系统版本一致性,更低的接入成本
开放性、源码兼容,提供更多的创造性
• 劣势
新版本新功能支持
49. DanceUI 开源计划: 23年12月之前!!
50. 扫码回复「D2」
获取第十七届 D2 演讲 PDF 材料
后续也将推送 D2 会后技术文章,敬请关注!!
51. 感谢大家观看