Groups:表格中的行,表示一个 Composable 函数或组件。每个 Group 包罗多个 Slots。
数据结构
SlotTable 的焦点字段包罗:
class SlotTable {
private val slots: IntArray // 存储 Slot 数据
private val groups: IntArray // 存储 Group 元数据
private var groupsSize: Int // Group 的数量
private var slotsSize: Int // Slot 的数量
}
复制代码
Slots:slots 是一个 IntArray,用于存储具体的数据(如状态值、文本内容等)。
Groups:groups 是一个 IntArray,用于存储 Group 的元数据(如范例、父 Group、子 Group 等)。
3. Group 的表示
每个 Group 在 groups 数组中占用了多个连续的槽位,用于存储以下信息:
Group 范例:表示 Group 的种类(如 Composable 函数、结构节点等)。
父 Group:指向父 Group 的索引。
子 Group:指向子 Group 的索引。
数据范围:指向 slots 数组中与该 Group 相干的数据。
Group 的结构
在 groups 数组中,一个 Group 的结构如下:
索引字段描述0KeyGroup 的唯一标识符1Parent父 Group 的索引2FirstChild第一个子 Group 的索引3NextSibling下一个兄弟 Group 的索引4DataStart数据在 slots 中的起始索引5DataEnd数据在 slots 中的结束索引 4. SlotTable 的焦点操作
SlotTable 提供了一系列方法,用于管理数据和组件结构。 插入 Group
fun insertGroup(key: Int, parent: Int, dataStart: Int, dataEnd: Int): Int
复制代码
插入一个新的 Group,并返回其索引。
更新 groups 和 slots 数组,确保数据的一致性。
删除 Group
fun removeGroup(group: Int)
复制代码
删除指定的 Group。
更新 groups 和 slots 数组,回收资源。
更新 Slot 数据
fun setSlot(index: Int, value: Any?)
复制代码
更新 slots 数组中指定索引的值。
假如值发生变革,标志 Group 为需要重组。
查找 Group
fun findGroup(key: Int, parent: Int): Int
复制代码
根据 key 和 parent 查找 Group。
假如找到,返回 Group 的索引;否则返回 -1。
5. SlotTable 的重组机制
SlotTable 通过以下机制支持高效的重组:
位置记忆(Positional Memoization):
每个 Composable 函数在 Slot Table 中都有一个固定的位置。
在重组时,Compose 根据位置快速定位和更新组件。
Gap Buffer:
SlotTable 使用 Gap Buffer 来高效地插入和删除数据。
Gap Buffer 将数组分为两部门,中央留出一个“间隙”,使得插入和删除操作的时间复杂度为 O(1)。
状态变革检测:
当状态发生变革时,SlotTable 会标志受影响的 Group 为“脏数据”,并在重组时重新执行相应的 Composable 函数。