Skip to content

从实验到可维护的渲染库 ​

教学实验可以集中展示一个概念;正式渲染库需要在数据、时间、框架和页面不断变化时仍保持含义。抽取库的目标是保存经过验证的算法和资源约定,不是把所有代码换个文件夹,或为每个动作新建一个 Manager。

让依赖沿一个方向流动 ​

应用负责请求、路由、界面和时间状态;数据适配层把业务格式变成明确的网格输入;纯算法处理采样(sampling)和几何;Cesium 图层负责渲染与资源。渲染库通常不应知道某个 API 地址、React state 或具体预报产品名。

text
应用状态 → 数据适配 → 采样/几何算法 → Cesium 图层
                                  ↘ 小型内部接口适配器

接口首先表达语义,例如维度、坐标轴、单位、缺测规则、数组所有权,而不是立即暴露所有底层开关。setTime(frame0,frame1,alpha) 比散落三个不相关 setter 更容易保持一致,但是否需要这一形式仍取决于真实使用场景。

小边界保护高风险部分 ​

Cesium 1.145.0 的内部纹理和命令接口集中在一个适配器(adapter),避免到处使用 any。适配器并不能让内部 API 变稳定;它只是让升级时能定位风险。升级验证应覆盖真实 shader 编译、GPU 采样、透明/裁切、资源销毁及模式交接,类型检查只是其中一部分。

GLSL 独立保存,构建为可导入的字符串模块,再显式组织 sources 与 defines。Cesium 自己就采用这类源文件到模块的路径,并通过 ShaderSource 组合。不要为了共享两段函数就建立另一套庞大的预处理语言;也不要每帧拼接和编译相同 shader。

测试围绕契约,而非围绕文件数 ​

CPU 参考测试检查公式、接缝和缺测;小型 GPU 检查比较实际输出;浏览器交互检查用户能否操作与退出。规则合成场便于计算期望值,固定种子的拟真场检查复杂边界。截图能验证布局,却不能证明温度单位、U/V 方向或高度数值正确。

也不要把只给当前应用使用的小库立即扩展成跨所有框架的发布体系。先确认调用者确实需要哪些能力,保留清楚输入和销毁协议,再按真实复用需求扩展。

一帧的节奏EXPERIMENT 01 · CESIUM 1.145.0

一帧的节奏

观察持续渲染与按需渲染,理解更新和绘制的关系。

在浏览器本地运行 · 无需账号 · 鼠标拖动旋转,滚轮缩放

底图:Natural Earth II(公共领域);其余几何和地形为教学合成。 数据说明
查看运行源码

此代码直接读取实际运行的实验模块。按 kind 分支定位当前实验,也可查看数据公式和 GLSL。

读取源码…

观察任务 ​

想象将当前标量实验搬进另一套 UI 框架:哪些部分应该原样复用,哪些应该重写?如果一个图层自己发起固定 URL 请求,又自己创建 Viewer,会产生什么限制?

展开答案

采样、色带语义、shader、网格与资源管理通常可复用;UI 状态绑定与组件生命周期需要新的适配。固定请求和自建 Viewer 会把数据来源、相机与页面布局绑进图层,难以与其他图层协作,也更难隔离测试与统一销毁。

阅读依据:Cesium 1.145 ShaderSource 源码(internal)、Cesium 1.145 构建脚本。

气象学 · 数学基础 · 地理可视化