Files
MapLibreParticleLab/docs/40_任务/10_架构调查指令书_v1.md
OpenAI Codex 74be2a5052
Some checks failed
validate-scripts / validate-scripts (push) Has been cancelled
docs: freeze particle architecture investigation and design
2026-08-29 12:33:09 +08:00

16 KiB
Raw Blame History

MapLibreParticleLab 10_架构调查指令书 v1

1. 任务基本信息

  • 项目:MapLibreParticleLab
  • 大阶段:10_架构调查
  • 当前基线分支:particle/main
  • 当前前置状态:总则 v1 已提交并推送
  • 任务性质:只读架构调查
  • 是否允许修改业务代码:否
  • 是否允许升级或安装依赖:否
  • 是否允许顺手修复发现的问题:否

2. 任务目标

对 MapLibreParticleLab 当前真实代码、依赖、原生工程、MapLibre 接入方式和渲染架构进行一次完整调查。

本阶段的目的不是设计最终粒子系统,而是回答:

当前项目实际上是怎样运行的,MapLibre 实际经过哪些层完成地图渲染,未来粒子系统有哪些真实可用的接入位置,以及当前仍有哪些关键问题无法仅通过现有代码确认。

最终必须形成一份基于实际仓库源码和配置的中文架构调查报告,为下一阶段 20_架构设计 提供事实基础。


3. 核心原则

3.1 以实际代码为唯一事实来源

不得根据:

  • 记忆
  • MapLibre 一般架构
  • React Native 常见做法
  • 网上其他项目的实现
  • 对新版 MapLibre 的印象

推断当前项目架构。

所有结论必须优先来自当前 particle/main 实际源码、配置、依赖锁定文件和原生工程。

如果某项无法通过仓库确认,必须明确标记为:

未确认

不得自行补全。

3.2 本任务只调查,不设计

本任务不得直接决定:

  • 最终粒子渲染技术路线
  • CPU 粒子还是 GPU 粒子
  • CustomLayer 是否作为最终方案
  • 是否修改 MapLibre Native
  • 是否自行创建原生 Renderer
  • 是否使用 Metal / OpenGL / Vulkan
  • 最终数据纹理格式
  • 最终 Shader 架构
  • 最终线程模型

可以列出候选扩展位置和现有限制,但不得提前作最终技术选型。

3.3 不预设多个调查任务

本次应尽可能一次完成整个 10_架构调查。

只有在调查后发现某个关键问题同时满足以下条件时,才建议追加新的调查任务:

  1. 无法依靠当前项目源码确认;
  2. 该问题会直接影响下一阶段技术路线;
  3. 需要额外读取第三方源码、编译验证、最小实验或平台专项验证。

不得为了形式完整主动拆出大量 10-01 / 10-02 / 10-03 子任务。


4. 开始前检查

开始调查后先确认以下信息:

  • 当前仓库确实为 MapLibreParticleLab
  • 当前分支为 particle/main
  • 读取当前 Git 状态
  • 确认工作区是否干净
  • 找到并完整阅读当前“总则 v1”
  • 确认项目根目录结构
  • 确认主要源码目录
  • 确认 Android / iOS 原生目录是否存在
  • 确认依赖清单及 lock 文件

如果当前分支或代码状态与上述基线明显不符:

不要修改仓库状态。

继续进行能够完成的只读调查,并在报告中明确记录实际状态。


5. 必做调查内容

5.1 项目整体架构

调查当前项目的真实目录与模块组织。

至少确认:

  • 项目入口
  • React Native / Expo / Bare RN 等实际工程形态
  • TypeScript / JavaScript 使用情况
  • Android 工程
  • iOS 工程
  • 公共源码目录
  • 地图相关源码目录
  • 实验代码目录
  • 数据处理目录
  • Shader 或图形相关资源目录
  • assets
  • scripts
  • docs
  • 测试目录
  • 构建配置
  • Metro 配置
  • Babel 配置
  • TypeScript 配置

报告中需要给出简化的当前项目结构图。

只列架构相关目录,不需要机械复制整个文件树。

5.2 当前依赖与版本

读取实际:

  • package.json
  • lock 文件
  • Android Gradle 相关配置
  • iOS Pod 相关配置
  • 与地图和图形渲染相关的依赖配置

重点确认:

  • React Native 版本
  • React 版本
  • MapLibre React Native 包及实际版本
  • MapLibre Android / iOS Native 版本,如能够从当前工程确认
  • Skia 或其他图形库是否存在
  • Reanimated 等与渲染相关的辅助依赖
  • OpenGL / Metal / WebGL / GPU 相关第三方库
  • Native Module / TurboModule / Fabric 相关配置

必须区分:

  1. 直接依赖
  2. 间接依赖
  3. 原生 MapLibre 底层实际版本

如果底层版本无法确认,明确写“未确认”。


6. MapLibre 当前接入链调查

这是本任务重点。

必须从项目实际地图页面或地图 Host 开始向下追踪。

调查:

业务/页面 ↓ React Native Map 组件 ↓ MapLibre React Native 封装 ↓ Android / iOS Native View ↓ MapLibre Native

需要确认当前代码实际使用的:

  • MapView
  • Camera
  • Style
  • Source
  • Layer
  • ShapeSource
  • RasterSource
  • ImageSource
  • CustomLayer,如存在
  • 地图事件
  • 地图生命周期事件
  • onPress
  • camera change
  • style load
  • render/frame 相关事件

报告中必须给出一张文字形式的实际调用关系图。

例如:

Screen → MapHost → MapView → RN MapLibre Binding → Native Map View

但最终结构必须根据当前代码得出,不得照抄该例子。


7. 地图生命周期调查

调查当前代码能够观察或控制哪些生命周期阶段。

至少关注:

  • 地图组件创建
  • Native Map 创建
  • Style 加载开始
  • Style Ready
  • 地图 Ready
  • Camera 变化
  • 地图移动
  • 地图缩放
  • 地图旋转
  • 每帧刷新能力
  • App 前后台
  • MapView unmount
  • Native 资源释放

明确:

当前 TS/RN 层已经直接获得哪些生命周期事件

以及:

哪些生命周期只存在 Native 或 MapLibre 内部,目前 JS 层拿不到


8. 自定义渲染扩展点调查

调查当前工程和当前依赖版本实际存在的自定义渲染能力。

重点寻找:

  • CustomLayer
  • CustomLayerHost
  • Native Layer
  • Render Layer
  • MapLibre 自定义 layer 接口
  • 自定义 View Overlay
  • Surface
  • Texture
  • GL Context
  • Metal Context
  • Renderer hook
  • Render pass
  • Native callback
  • Frame callback

每个发现必须分类。

A. 当前项目已经直接使用

B. 当前依赖已经暴露,但项目尚未使用

C. MapLibre Native 可能支持,但 RN 封装当前未暴露

D. 当前代码无法确认

不要把 B/C/D 写成“当前已经支持”。


9. Android 渲染架构调查

单独调查 Android。

至少确认:

  • MapLibre Android Native 如何被当前 RN 包引入
  • MapView 对应原生 View
  • renderer 所处代码边界
  • 当前工程是否显式涉及 OpenGL
  • 是否能够找到 render thread 相关实现或接口
  • 地图帧刷新由谁驱动
  • Camera / transform 数据当前在哪一层
  • Native Module 是否能够接触 MapView 实例
  • 是否存在可插入自定义渲染的明确入口
  • JS 与 Native 的当前桥接方式

如果当前项目使用 New Architecture,也需要说明其实际启用状态。


10. iOS 渲染架构调查

Android 与 iOS 不得合并推断。

单独确认:

  • iOS MapLibre Native 依赖
  • MapView 原生类型
  • Metal / OpenGL 实际情况
  • renderer 生命周期
  • Camera / transform 数据
  • RN 到 Native 的连接方式
  • 是否能够确认自定义渲染接口
  • 当前 Native 层能够访问的 MapLibre 对象范围

如果 Android 与 iOS 能力不一致,必须明确列出。


11. JS / UI / Native / Render / GPU 边界

基于当前工程实际情况,整理线程和执行层级。

至少区分:

  • JavaScript Thread
  • React Native UI/Main Thread
  • Android/iOS Native 层
  • MapLibre 内部 Worker
  • MapLibre Render Thread
  • GPU

如果某个平台实际名称有所不同,使用项目和 MapLibre 当前版本对应的真实名称。

重点调查:

  • 当前高频数据从 JS 传 Native 会经过什么链路
  • 地图 Camera 高频变化如何传播
  • 是否存在 JS 每帧回调
  • 是否存在 Native 每帧回调
  • 是否存在直接 GPU 资源更新的位置
  • 哪些数据如果每帧跨 JS Bridge 会形成明显风险

这里只描述架构事实和风险,不提前设计最终优化方案。


12. Camera 与坐标变换能力

粒子系统未来必须与地图同步,因此重点调查当前代码能够获得哪些:

  • center
  • zoom
  • bearing
  • pitch
  • bounds
  • viewport size
  • screen coordinate
  • geographic coordinate
  • projection / unprojection
  • camera matrix
  • projection matrix
  • view matrix
  • transform matrix

区分:

  1. JS API 可以直接获取
  2. Native API 可以获取
  3. MapLibre 内部存在但当前封装未暴露
  4. 无法确认

尤其要明确:

当前是否可以获得足够信息,使自定义粒子渲染与 MapLibre 地图的平移、缩放、旋转、pitch 保持严格同步。

如果不能确认,不得猜测。


13. 帧驱动能力

调查未来粒子动画最关键的问题:

谁负责下一帧?

确认当前可利用的:

  • requestAnimationFrame
  • RN animation frame
  • Reanimated frame callback
  • Native Choreographer / DisplayLink
  • MapLibre render loop
  • CustomLayer render callback
  • GPU render callback

需要说明:

  • 哪些帧驱动来自地图 Renderer 本身
  • 哪些与地图 Renderer 独立
  • 如果使用独立动画循环,理论上可能出现什么同步问题

这里只进行架构分析。


14. 当前数据与实验代码调查

搜索当前仓库内已经存在的:

  • particle
  • wind
  • current
  • wave
  • grid
  • vector field
  • raster
  • interpolation
  • texture
  • shader
  • velocity
  • animation
  • GPU
  • GL
  • Metal
  • MapLibre custom rendering

以及相关实验代码。

对发现的代码进行分类:

  • 可复用基础代码
  • 仅实验用途
  • 与最终架构可能无关
  • 已弃用
  • 状态不明确

不得因为文件名相似就判定“可复用”。

需要查看真实实现。


15. 海洋/气象格点数据未来可能经过的现有层

本任务不设计数据系统,只调查当前项目有哪些已经存在的基础设施。

关注未来可能涉及:

原始格点数据 → 解析 → 内存结构 → 插值 → 渲染资源 → 地图显示

调查当前是否已经存在:

  • 数据 Fetch 层
  • ArrayBuffer
  • TypedArray
  • 二进制解码
  • Grid 数据模型
  • 经纬度格点模型
  • 缓存
  • Worker
  • Native Buffer
  • Texture Upload
  • Shader Uniform
  • 数据生命周期管理

报告只描述现状。


16. 性能风险调查

不得运行大型性能优化工作。

仅根据真实架构识别潜在风险。

至少关注:

  • JS 高频循环
  • 每帧 JS → Native 调用
  • 大数组 Bridge 传输
  • JSON 序列化
  • ArrayBuffer 复制
  • Native → GPU 重复复制
  • Texture 高频重建
  • 地图 Camera 变化导致的大规模重新计算
  • React re-render
  • MapView Overlay 与地图不同步
  • Android/iOS 实现分叉
  • GPU context 共享风险
  • 地图销毁后的资源泄漏

风险需要标记等级:

  • 高
  • 中
  • 低
  • 尚无法判断

17. 当前架构图

最终调查报告必须至少包含以下几个简化架构图。

全部使用 Markdown 文本图即可。

17.1 当前 App / MapLibre 总体调用图

17.2 JS → Native → MapLibre 调用链

17.3 Android 地图渲染相关层级

17.4 iOS 地图渲染相关层级

17.5 当前能够确认的数据与渲染边界

不得为了图看起来完整而补画未经确认的组件。

未知位置使用:

[未确认]


18. 关键结论分类

调查报告结尾必须将全部关键结论整理成四类。

18.1 已确认事实

只能放已有源码或配置证据的事实。

18.2 当前限制

当前架构真实存在的限制。

18.3 候选扩展点

当前看来可能承载未来粒子系统的位置。

这里只列候选,不做最终选择。

18.4 未确认问题

列出不能通过本次仓库静态调查确认,但会影响后续架构设计的问题。

每个“未确认问题”注明:

  • 为什么当前无法确认
  • 是否会阻塞 20_架构设计
  • 如果需要继续调查,建议采用什么最小方式确认

19. 是否需要追加调查任务的判断

本次调查结束时必须明确给出:

A. 可以直接进入 20_架构设计

或:

B. 必须追加一个新的 10_架构调查 子任务

只有关键技术事实无法确认并且会直接影响架构选择时才能选择 B。

如果选择 B,只提出真正需要的最少调查任务。

不得为了保险而把所有未知问题拆成新任务。


20. 禁止事项

本任务禁止:

  • 修改生产源码
  • 修改实验源码
  • 新建粒子实现
  • 修改 MapLibre 接入
  • 升级 MapLibre
  • 升级 React Native
  • 安装任何新 npm 包
  • 安装任何新 Pod
  • 修改 Gradle 依赖
  • 修改 Podfile
  • 修改 Metro
  • 修改 Babel
  • 修改 TypeScript 配置
  • 修改 Android 原生代码
  • 修改 iOS 原生代码
  • 创建 Shader 实现
  • 创建 CustomLayer 实现
  • 创建 Native Module
  • 进行架构重构
  • 顺手修复发现的问题

发现问题只记录。


21. 允许执行的验证

允许执行不会改变项目状态的只读命令,例如:

  • Git 状态查询
  • Git 分支查询
  • 文件搜索
  • 文本搜索
  • 查看 package 配置
  • 查看 Gradle 配置
  • 查看 Pod 配置
  • 查看源码
  • 查看当前项目已有脚本定义

如果某个命令可能:

  • 自动安装依赖
  • 修改 lock 文件
  • 修改构建产物
  • 修改 Native 工程
  • 写入项目配置

则不要执行。

本任务主要依赖静态调查。


22. 必做输出

22.1 架构调查成果

必须生成中文调查报告:

docs/20_调查/10_架构调查报告_v1.md

如果同名文件已经存在,不得覆盖,应递增版本号。

该报告是后续 20_架构设计 的主要输入。

22.2 Codex 完成报告

必须生成中文执行完成报告:

docs/报告/10_架构调查_Codex完成报告_v1.md

如果 docs/报告/ 不存在,则创建该目录。

如果同名报告已经存在,不得覆盖旧报告,应递增版本号。


23. 架构调查报告必须包含

docs/20_调查/10_架构调查报告_v1.md 至少包含:

  1. 调查环境
  2. Git / 分支 / 工作区状态
  3. 总则 v1 读取情况
  4. 当前项目整体架构
  5. 核心依赖与版本
  6. MapLibre 接入链
  7. MapLibre 生命周期
  8. 自定义渲染能力
  9. Android 渲染架构
  10. iOS 渲染架构
  11. JS / Native / Render / GPU 边界
  12. Camera / Matrix / 坐标转换能力
  13. 帧驱动能力
  14. 当前数据与粒子相关实验代码
  15. 当前可复用基础设施
  16. 性能与线程风险
  17. 当前架构图
  18. 已确认事实
  19. 当前限制
  20. 候选扩展点
  21. 未确认问题
  22. 是否需要追加调查任务
  23. 是否已经具备进入 20_架构设计 的条件

24. Codex 完成报告必须包含

docs/报告/10_架构调查_Codex完成报告_v1.md 至少包含:

  1. 本次实际调查范围
  2. 必做项逐项状态:已完成 / 未完成 / 无法验证
  3. 未完成或无法验证的原因
  4. 实际生成或修改的文档清单
  5. 是否修改生产代码
  6. 是否安装或升级依赖
  7. 是否存在需要用户关注的阻塞项
  8. 下一步建议

25. 必做项完成检查

完成前逐项检查:

  • 已读取总则 v1
  • 已确认当前实际 Git 基线
  • 已调查整体目录和工程形态
  • 已确认核心依赖版本
  • 已追踪 MapLibre 实际调用链
  • 已调查地图生命周期
  • 已调查自定义渲染扩展点
  • 已分别调查 Android
  • 已分别调查 iOS
  • 已调查线程与执行边界
  • 已调查 Camera / 坐标 / Matrix 能力
  • 已调查帧驱动能力
  • 已搜索现有粒子/场数据/Shader 实验代码
  • 已调查当前可复用的数据基础设施
  • 已整理性能风险
  • 已绘制必要架构图
  • 已区分事实、限制、候选和未知项
  • 已判断是否需要追加调查
  • 已判断能否进入 20_架构设计
  • 未修改生产代码
  • 未升级或安装依赖
  • 已生成 docs/20_调查/ 下的正式调查报告
  • 已生成 docs/报告/ 下的 Codex 完成报告

不得静默跳过任何必做项。

无法完成的项目必须明确写:

未完成

或:

无法验证

并说明原因。


26. 完成标准

本任务完成的标准不是“找到一个粒子方案”。

真正完成标准是:

已经能够基于 MapLibreParticleLab 当前真实代码,准确描述项目、React Native、Native、MapLibre 和 GPU 之间的现有边界,并明确下一阶段进行粒子系统架构设计时,哪些能力已经确认、哪些扩展位置值得考虑、哪些关键事实仍需要额外验证。

达到这个状态后,10_架构调查 才算完成。

除非存在真正阻塞架构选择的未知项,否则下一步直接进入:

20_架构设计