3 个版本

0.2.0 2023 年 8 月 16 日
0.1.2 2024 年 3 月 5 日
0.1.1 2022 年 7 月 27 日
0.1.0 2022 年 3 月 1 日

#2 in #dirty


2 个 crate 中使用

MIT/Apache

12KB
178

等同于记录层次脏


lib.rs:

该库用于对树形结构数据标记脏。与普通的脏编辑不同,LayerDirty将同一层的节点索引放入同一个Vec中,并将这些Vec按照层的大小,由小到大放置在一个更外层的Vec中。例如[[1, 2, 3], [], [4, 5, 6], [7, 8]],表示第0层中的节点1、节点2、节点3被标记为脏,第1层没有脏节点,第2层中节点4、节点5、节点6被标记为脏,第3层中节点7、节点8被标记为脏。LayerDirty特别适合对树形结构中,子节点的数据计算依赖于父节点的数据计算。

一个常用的例子是:UI中的节点被组织成树形结构,每个节点都存在transform属性,可以对当前节点进行变换(是将本节点和其子节点作为整体进行变化)。根据公式,一个节点的最终变换,实际上是父变换*子变换,如果有更多的父节点,则为...祖先*子。因此,以三层节点为例,先从祖节点开始计算祖节点的最终变换(祖最终变换 = 祖变换),根据结果计算父节点的最终变换(父最终变换 = 祖最终变换* 父变化),再根据父的计算结果计算子的最终变换(子最终变换 = 父最终变换* 子变化)。如果我们将计算顺序反过来,势必会造成多重重复计算:子最终变换 = 子变化;父最终变换 = 父变换;子最终变换= 父最终变换 * 子变化(前一步计算的子最终变换由于缺少父的影响,并不是真正的结果,需要重新计算)...可以看到,同一个节点可能被反复计算多次

LayerDirty就是为了解决这种父子存在计算顺序的问题。利用LayerDirty,你可以非常轻松的先迭代父脏,再迭代子脏(其中的脏对每一层进行了划分,并按照层从小到大的顺序排列,我们只需要从最外层数组的第一个开始迭代就可以了)

依赖项

~2MB
~44K SLoC