mirror of
https://github.com/AtomUI/AtomUI.git
synced 2026-10-23 01:38:40 +08:00
FloatButton Performance Notes
Scope
本轮补充 FloatButton 动态 children 同步路径:
FloatButtonGroup.Children -> FloatButtonItemsControl.ChildrenFloatButtonItemsControl.Children -> StackPanel.ChildrenFloatButtonGroupHost.Children -> FloatButtonGroup.Children
Root Cause
- FloatButton group add/remove 原先在多个
NotifyCollectionChanged分支里用OfType<Control>()做类型过滤。 FloatButtonGroupadd 分支还会先遍历NewItems配置 embed mode,再让OfType<Control>()二次扫描NewItems插入子集合。- remove 分支使用
RemoveAll会进入 AvaloniaHashSet<T>+ 目标集合扫描路径;镜像集合已有OldStartingIndex/OldItems.Count,RemoveRange更直接。参考.referenceprojects/Avalonia/src/Avalonia.Base/Collections/AvaloniaList.cs:530-550。
Changes
- FloatButton add 路径改为一次 indexed collect 后复用同一
List<Control>做 embed-mode 配置和InsertRange。 FloatButtonGroup/FloatButtonItemsControl/FloatButtonGroupHostremove 路径改为RemoveRange(OldStartingIndex, OldItems.Count)。- 保留 trigger/menu、badge、overlay host、motion actor 行为不变。
Benefit
这轮是结构性收益:FloatButton 动态 children add/remove 少一次源集合类型过滤,remove 不再走 HashSet + 全集合扫描。不声明本轮页面加载耗时提升。
| Metric | Baseline | Optimized | Formula | Improvement | Conclusion |
|---|---|---|---|---|---|
FloatButton collection sync OfType<Control> callsites |
6 | 0 | (6 - 0) / 6 |
100.00% | 有效;group、items control、group host add/remove 均去掉 LINQ 类型过滤 |
FloatButtonGroup add source scans before insert |
2 scans | 1 scan | (2 - 1) / 2 |
50.00% | 有效;一次 collect 结果同时用于 embed-mode 配置和插入 |
| Mirrored children remove target scans | 3 scans | 0 scans | (3 - 0) / 3 |
100.00% | 有效;group、items control、group host 均按 OldStartingIndex 删除 |
| Page-load timing claim | none | none | n/a | n/a | 本轮没有有效前后 timing,不声明页面级速度收益 |
Group Menu Motion Easing Cache
FloatButtonGroup 菜单展开/收起时仍需要按 placement 和当前尺寸创建 motion,但默认 CubicEaseOut / CubicEaseIn 不需要每次交互重复创建。Avalonia 两个 easing 类只有 Ease(double) override,没有实例字段(.referenceprojects/Avalonia/src/Avalonia.Base/Animation/Easings/CubicEaseOut.cs:7-13,.referenceprojects/Avalonia/src/Avalonia.Base/Animation/Easings/CubicEaseIn.cs:7-13)。
| Metric | Baseline | Optimized | Formula | Improvement | Conclusion |
|---|---|---|---|---|---|
| FloatButtonGroup default easing allocations / menu show | 1 | 0 | (1 - 0) / 1 |
100.00% | 有效;show motion 复用默认 easing |
| FloatButtonGroup default easing allocations / menu hide | 1 | 0 | (1 - 0) / 1 |
100.00% | 有效;hide motion 复用默认 easing |
| FloatButtonGroup motion objects / menu show-or-hide | 1 | 1 | (1 - 1) / 1 |
0.00% | 行为保持;motion 仍按 placement 即时创建 |
说明:这是交互 motion 路径 structural-only 收益;没有新增 Gallery timing 对比,不声明页面加载速度提升。
Verification
dotnet build -c Release -f net10.0 --no-restore tools/performances/AtomUI.Performance/AtomUI.Performance.csprojpassed.--verify-floatbutton-states当前仍受旧 overlay/badge/lazy menu 断言影响,不能作为本轮集合同步路径的通过证明。