프로젝트 소개
tessella는 MapLibre 스타일 사양의 프론트엔드를 구현하는 독립적인 Rust 프로젝트입니다. 스타일 파싱, 표현식 평가, 소스 및 타일 관리, 네트워크 및 캐싱, 레이아웃 및 버킷 생성, 글리프 및 스프라이트 아틀라스, 변환 및 카메라 처리, 렌더링 오케스트레이션 등 맵 프론트엔드의 모든 작업을 수행하지만, 직접 그리지는 않습니다. 대신 지오메트리, 유니폼, 텍스처, 그리기 순서 및 카메라 상태가 포함된 평면 엔벨로프 ABI 형태의 캡처 스트림을 생성합니다. 이러한 분리를 통해 프론트엔드는 GPU 없이 순수 Rust로 구현되어 그래픽 스택 없이도 aarch64 및 riscv64로 교차 컴파일할 수 있으며, 렌더러는 교체 가능한 소비자(consumer)가 됩니다.
상태는 가능한 한 프로세스 범위로 제한되며, 필요한 경우에만 뷰(view)별로 관리됩니다. 버킷은 카메라와 무관하고 줌 보간이 유니폼에서 처리되므로, 단일 스타일, 파일 소스 스택, 타일 저장소, 버킷 세트 및 글리프 아틀라스가 여러 뷰 간에 공유됩니다. 뷰별 상태는 변환, 커버 결정, 심볼 배치 및 일부 유니폼 블록으로 제한됩니다. CI 카운터에 따르면, 4개의 맵 뷰를 사용할 때 하나의 지오메트리 스트림과 4개의 작은 뷰 스트림만 소요되며, 페치, 디코딩 및 버킷 빌드 비용은 뷰 수에 관계없이 일정하게 유지됩니다. 트래픽은 변경 사항에 비례합니다. 정지된 맵은 0바이트를 생성하고, 순수 카메라 이동은 카메라 블록만 생성하며, 변경 사항이 있을 때만 지오메트리를 생성합니다. SPSC 링 전송은 병합 가능한 엔벨로프를 위해 절대 상태 쓰기를 사용하며, 소비자가 지연될 경우 점유율을 제한합니다.
워크스페이스에는 facade(tessella, 현재 버전 0.0.0의 이름 예약 스텁), style(tessella-style), sources(tessella-source), tiles(tessella-tile), storage(tessella-storage), layout(tessella-layout), placement(tessella-place), orchestration(tessella-orchestrate), capture ABI(tessella-capture-abi), glyph 처리(tessella-glyph)를 위한 크레이트들이 포함되어 있습니다. 현재 tessella 크레이트만 crates.io에 게시되었으며, 나머지는 내용이 채워질 때까지 게시되지 않습니다.
현재 상태는 R0 완료 단계입니다. 프로듀서는 밀폐된 스타일(hermetic style)에 대해 전체 스트림을 생성합니다. C++ 오라클 구현체인 mbgl-capture-probe가 동일한 스타일과 카메라에 대해 캡처 스트림의 표준 직렬화 데이터를 생성하며, 두 데이터를 비교(diff)합니다. 비교 항목에는 지오메트리, 유니폼 버퍼, 텍스처, 클립 마스크, 페인터 순서 및 16개 요소 모두 비트 단위로 일치하는 카메라 블록이 포함됩니다. 뷰 선언 및 해제 쌍(DR-18)에 대해서만 시퀀스 체크를 수행합니다. 즉, 뷰는 사용 전에 선언되어야 하고, 지오메트리는 이를 그리는 순서보다 앞서야 하며, 순서는 해당 에포크를 명시하는 카메라보다 앞서야 합니다. 고정된 뷰는 0바이트를 씁니다. 캡처 ABI는 동결되었으며, C11 및 C++17 모두에서 컴파일되는 필드별 오프셋 어설션이 포함된 생성된 C 헤더를 제공합니다.
두 가지 의도적인 차이점이 문서화되어 있습니다. 첫째, GeoJSON 폴리곤 정점 순서는 mbgl이 wagyu를 통해 링을 정규화하므로 오라클의 회전된 형태이며, 따라서 diff는 링을 사이클로 비교합니다(DR-19). 둘째, 프로브가 회전되지 않았고 쿼터니언 경로를 확인할 방법이 없으므로 투영에서 bearing과 pitch를 거부합니다. 벡터 타일, 네트워크 및 캐시, 라인 레이어, 데이터 기반 바인더, 표현식 VM이 포함된 R1 단계는 아직 시작되지 않았습니다. plan.md에 rev 0.9 기준의 설계 기록이 문서화되어 있습니다.
소비자로는 Filament 기반 소비자 및 엔티티/HAL 레벨에서 소비하는 impeller-rs(순수 Rust Impeller 재구현)가 있습니다. 맵은 SSBO 지원 백엔드가 필요하며, 현재는 Vulkan이며 소비자가 구현할 경우 GLES 3.1+가 가능합니다. riscv64는 프로듀서, 소크(soak) 및 교차 컴파일 레인으로만 사용됩니다. 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가 사용됩니다. golden 오라클 참조 덤프가 tests/golden에 저장되어 있어 C++ 빌드 없이도 Rust 측을 확인할 수 있습니다. tessella-capture-abi의 생성된 mbgl 파생 미러는 고정된 maplibre-native 트리에서 가져와 커밋되었으며, mbgl-codegen을 cargo run으로 실행하여 재생성하거나 확인할 수 있습니다. include/의 평면 C 헤더는 크기, 정렬 및 필드 오프셋에 대한 정적 어설션과 함께 Rust 정의에서 생성됩니다.
tessella는 독립적인 프로젝트이며 MapLibre 조직과 제휴하거나 보증받지 않았으며, mln 네임스페이스를 사용하지 않습니다. 라이선스는 BSD-2-Clause입니다.
Comments
0 Rating appears after 10 ratings
Sign in to join the discussion.