这个项目能做什么

tessella 是一个独立的 Rust 项目,实现了 MapLibre 样式规范的前端。它执行地图前端的所有工作——解析样式、评估表达式、管理数据源和瓦片、网络与缓存、布局和 bucket 生成、字形与精灵图集、变换与相机处理以及渲染编排——但它不执行绘制。相反,它输出一个捕获流:在扁平的 envelope ABI 中包含几何形状、uniforms、纹理、绘制顺序和相机状态。这种分离使得前端无需 GPU 且为纯 Rust 实现,因此可以在没有图形栈的情况下交叉编译到 aarch64 和 riscv64,而渲染器则成为一个可替换的消费者。 状态尽可能在进程范围内定义,仅在必要时按视图定义。单个样式、文件源栈、瓦片存储、bucket 集合和字形图集在多个视图之间共享,因为 bucket 与相机无关,且缩放插值存在于 uniforms 中。每视图状态仅限于变换、覆盖决策、符号放置和少量 uniform 块。该项目声称四个地图视图仅需一个几何流加上四个小型视图流,且获取、解码和 bucket 构建的开销不随视图数量增加,这一点由 CI 计数器支持。流量与变化成正比:静止的地图不输出字节,纯相机运动输出一个相机块,只有数据变动才会输出几何形状。一个 SPSC 环形传输机制使用绝对状态写入以实现可合并的 envelope,在消费者停顿时限制占用量。 工作区包含多个 crate:facade (tessella,目前为 0.0.0 版本的名称预留存根)、样式 (tessella-style)、数据源 (tessella-source)、瓦片 (tessella-tile)、存储 (tessella-storage)、布局 (tessella-layout)、放置 (tessella-place)、编排 (tessella-orchestrate)、捕获 ABI (tessella-capture-abi) 和字形处理 (tessella-glyph)。仅 tessella crate 发布到 crates.io;其余部分在包含实际内容前设置为 publish = false。 当前状态为 R0 完成。生产者为密封样式输出完整流。一个 C++ 参照实现 mbgl-capture-probe 为相同的样式和相机输出捕获流的标准序列化结果,两者进行比对。对比涵盖了几何形状、uniform 缓冲区、纹理、裁剪掩码、绘制顺序和相机块,其投影在所有 16 个元素中均实现了位级匹配。我们独立检查了序列:视图在调用前声明,几何形状在绘制顺序之前,而顺序在命名其 epoch 的相机之前。稳定视图不写入字节。捕获 ABI 已冻结,生成的 C 头文件包含每字段偏移量断言,可同时编译为 C11 和 C++17。 文档记录了两个刻意的差异:GeoJSON 多边形顶点顺序是参照实现的旋转版本,因为 mbgl 通过 wagyu 规范化环,因此比对时将环视为循环 (DR-19)。此外,投影拒绝 bearing 和 pitch,因为 probe 是未旋转的,且没有可比对的四元数路径。R1(矢量瓦片、网络与缓存、线图层、数据驱动绑定、表达式 VM)尚未开始。plan.md 记录了 rev 0.9 的设计。 消费者包括一个基于 Filament 的消费者和 impeller-rs(纯 Rust 实现的 Impeller),在实体/HAL 层级进行消费。地图需要支持 SSBO 的后端——目前是 Vulkan,如果消费者实现一个,则可以是 GLES 3.1+。riscv64 仅作为生产者、浸泡测试和交叉编译通道;VisionFive 2 可以构建 tessella 但不能用它绘图。 构建使用 rust-toolchain.toml 固定的 Rust 1.94.1 工具链,该版本由 Yocto wrynose (6.0) 在 oe-core 中提供。CI 包含一个建议的稳定通道。aarch64-unknown-linux-gnu 和 riscv64gc-unknown-linux-gnu 的交叉编译通道仅执行 cargo check。测试使用 cargo clippy 和 cargo test。黄金参照 dump 存储在 tests/golden 中,因此 Rust 端无需 C++ 构建即可检查。tessella-capture-abi 中生成的 mbgl 镜像来自固定的 maplibre-native 树并已提交;运行 mbgl-codegen 可重新生成或检查它们。include/ 中的扁平 C 头文件由 Rust 定义生成,具有大小、对齐和字段偏移量的静态断言。 tessella 是独立的,不隶属于 MapLibre 组织,也不受其认可,且不使用 mln 命名空间。许可证为 BSD-2-Clause。