Repository navigation
首次公开发布
Axisly 是面向原生 UI 的 C++20 布局库,核心仅依赖 C++ 标准库。
常规构建和使用无需 Rust;Rust 仅用于可选的 Taffy 参考测试与比较基准。
- 支持在同一棵树中组合 Block / FlowRoot、Flexbox 与 Grid,提供内容测量、
尺寸约束、定位、双向对齐、滚动范围和可选设备像素取整。 - 提供自有
LayoutTree和宿主树LayoutSource/LayoutSession两种接入方式,
支持脏标记、测量与布局缓存、共享内存、按节点查询和独立树批量计算。 - 通过
add_subdirectory或安装后的find_package(axisly CONFIG REQUIRED)
接入,统一链接axisly::axisly。需要 C++20 编译器和 CMake 3.25+。 - 提供中英文 README、控制台示例、SDL3 Playground、GeeyoouUI Showcase,
以及带环境与原始数据的 Axisly / Taffy / Yoga 比较基准。 - 发布源码 ZIP、tar.gz、SHA-256 校验文件和资产清单;使用方按自己的平台与编译器构建。
破坏性变更:统一 Grid 语义
BREAKING CHANGE:删除原生 compute_grid、GridCache、GridTree 及配套的
Track/GridSpec/GridItem/测量与结果类型,不保留别名或兼容层。
Grid 统一通过 axisly::css::Style、TrackSizing、GridLine 和布局树计算。
保留 LayoutTree 与 LayoutSource/LayoutSession 两种接入方式,共用同一个 CSS 内核。
控制台示例合并为 css_grid.cpp;GeeyoouUI、SDL3 Playground、安装后消费者及基准均已迁移。
旧原生算法专属测试和参考驱动随实现移除,CSS 测试与全量上游差分保留。
BREAKING CHANGE:删除 css::LayoutTree::remove 重复入口,原调用直接改为
remove_subtree,递归删除行为不变。仅删除节点并保留其子节点时使用 remove_node。
评审修复
- 修复 macOS 标准库缺少
std::jthread时的测试构建;并发契约测试仍保留线程回收。 - 在 ThreadSanitizer 中跳过会触发运行时主动终止的超大分配探针,普通构建继续覆盖该路径。
- 统一 Rust 参考工具的格式,恢复 CI 格式检查。
- 修复 GCC 构建 C++ 参考驱动时,条件表达式接收 Grid 轨道初始化列表的兼容问题。
- 批量
set_children只扫描一次祖先链,并按旧父节点统一移除迁移项;相同子节点列表直接复用。 - 叶子发布数组预留根槽位;隐藏子树的尺寸/基线查询保留深度检查,省去后代几何构造。
- 减少 Block 的布局盒拷贝和重复父节点查找;仅切换 Grid 轨道报告时保留无关分支缓存。
- 借用模式的已发布几何增加惰性排序索引;浮动子树检测跨计算复用,并保留深度与失效检查。
- 像素取整复用上下文相同的不可变子树输出;按需输出复用已完成的取整数值检查。
- Flex 基线查询仅对选定项目执行最终布局,保留行测量、反向排列与定位语义。
- 增加查询、Block、取整及基线专项基准和分配探针,结果见
benchmarks/hotpath-optimization.md。 - 优化
set_style重复提交:相同样式跳过复制与重复校验,保留布局缓存;
实际变更先校验并准备新样式,分配失败不影响旧样式和已发布结果。
参数由按值传递改为const Style&/Style&&重载;普通调用方式不变,
使用成员函数指针的调用方需显式选择重载,全部使用方须重新编译。 - 修复测量回调的
std::overflow_error/std::length_error被误转为布局错误的问题;
所有回调异常保留类型和值向外传播,并保留上一份完整结果。 - 均衡 Flex 换行复用临时数组和连续动态规划表,保留原来的划分语义和工作量预算。
- 三方基准默认包含
build,默认 3 轮、每轮 9 批;增加探索性 95% 区间和不确定性标记。 - 补充默认 Flex 行布局、共享测量选择和各错误码的边界说明。
完整变更与迁移说明:CHANGELOG.md。