Об этом проекте
tessella — это независимый проект на Rust, реализующий фронтенд для спецификации стилей MapLibre. Он выполняет всю работу фронтенда карты — парсинг стилей, вычисление выражений, управление источниками и тайлами, сетевое взаимодействие и кэширование, генерацию макетов и бакетов, атласы глифов и спрайтов, обработку трансформаций и камеры, а также оркестрацию рендеринга — но сам ничего не рисует. Вместо этого он генерирует поток захвата (capture stream): геометрию, униформы, текстуры, порядок отрисовки и состояние камеры в плоском ABI конверта. Такое разделение делает фронтенд независимым от GPU и написанным на чистом Rust, что позволяет кросс-компилировать его под aarch64 и riscv64 без графического стека, в то время как рендерер становится заменяемым потребителем.
Состояние по возможности ограничено областью процесса и только там, где это необходимо, привязано к конкретному виду (view). Один стиль, стек файловых источников, хранилище тайлов, набор бакетов и атлас глифов используются совместно между видами, так как бакеты не зависят от камеры, а интерполяция зума реализована в униформах. Состояние конкретного вида ограничено трансформацией, решениями по покрытию, размещением символов и несколькими блоками униформ. Заявляется, что четыре вида карты стоят одного потока геометрии плюс четырех небольших потоков видов, при этом количество запросов, декодирований и построение бакетов остаются неизменными независимо от количества видов, что подтверждается счетчиками CI. Трафик пропорционален изменениям: статичная карта генерирует ноль байт, чистое движение камеры генерирует блок камеры, и только изменения контента генерируют геометрию. SPSC-кольцевой транспорт использует абсолютную запись состояния для объединяемых конвертов, ограничивая заполнение в случае задержки потребителя.
Рабочее пространство включает крейты для фасада (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 опубликован в crates.io; остальные имеют параметр publish = false до появления контента.
Текущий статус — завершение R0. Продюсер генерирует полный поток для герметичного стиля. Реализация на C++ в качестве оракула, mbgl-capture-probe, генерирует каноническую сериализацию потока захвата для того же стиля и камеры, и эти два потока сравниваются. Сравнение охватывает геометрию, буферы униформ, текстуры, маски обрезки, порядок отрисовки и блок камеры, чья проекция совпадает бит в бит по всем шестнадцати элементам. Только наша часть — пара объявления и освобождения вида DR-18 — проверяется по последовательности: вид объявляется перед использованием, геометрия предшествует порядку отрисовки, а порядок предшествует камере, называющей свою эпоху. Стабильный вид записывает ноль байт. ABI захвата заморожен, сгенерированный заголовочный файл C содержит утверждения о смещении полей, которые компилируются как в C11, так и в C++17.
Документированы два намеренных различия: порядок вершин полигонов GeoJSON является ротацией оракула, так как mbgl нормализует кольца через wagyu, поэтому diff сравнивает кольца как циклы (DR-19). Также проекция отклоняет bearing и pitch, так как зонд не повернут и нет данных для проверки пути кватерниона. Этап R1 — векторные тайлы, сеть и кэш, слой линий, дата-дрифен биндеры, VM выражений — еще не начат. Файл plan.md документирует дизайн на ревизии 0.9.
Потребители включают решение на базе Filament и impeller-rs (реализация Impeller на чистом Rust), потребляющие данные на уровне entity/HAL. Картам требуется бэкенд с поддержкой SSBO — сегодня это Vulkan, или GLES 3.1+, если потребитель его реализует. riscv64 используется только как линия продюсера, замачивания и кросс-компиляции; VisionFive 2 может собрать tessella, но не может рисовать с ее помощью.
Сборка использует тулчейн, закрепленный в rust-toolchain.toml на Rust 1.94.1, который поставляется в Yocto wrynose (6.0) в oe-core. CI содержит консультативную стабильную линию. Линии кросс-компиляции ограничены cargo check для aarch64-unknown-linux-gnu и riscv64gc-unknown-linux-gnu. Тесты используют cargo clippy и cargo test. Эталонные дампы оракула находятся в tests/golden, чтобы Rust-сторона могла проверяться без сборки C++. Сгенерированные зеркала на базе mbgl в tessella-capture-abi происходят из закрепленного дерева maplibre-native и закоммичены; запуск cargo run для mbgl-codegen перегенерирует или проверяет их. Плоский C-заголовок в include/ генерируется из определений Rust со статическими утверждениями о размере, выравнивании и смещениях полей.
tessella является независимым проектом, не связана с организацией MapLibre, не поддерживается ею и не использует пространство имен mln. Лицензия — BSD-2-Clause.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.