Skip to content

Entity 与 Primitive 的边界 ​

Entity 让代码围绕“这是什么对象”组织:站点有位置、名称与属性,台风路径随时间变化。Primitive 更接近“这一批几何怎样绘制”:顶点、实例属性、外观与渲染状态直接参与表达。选择两者应从数据和更新方式出发,不能把较底层的 API 自动等同于更高性能。

高层对象会被转换 ​

Entity 通过可视化组件转换到底层绘制对象,Cesium 可以对适合的几何做批处理。十个 Entity 不一定对应十次绘制,一个 Primitive 也不保证永远只有一次 GPU 命令。是否合批还与材质、透明度、几何类型及更新方式有关。

下面把一个经纬矩形直接作为 Primitive 加入场景。Rectangle 描述地理范围,RectangleGeometry 则描述怎样生成该范围内的几何;相似的名字不代表相同的数据层次。

以下是接在第二课初始化之后的功能片段,沿用已经导入的 Cesium 命名空间和已创建的 viewer,省略容器与初始化代码。

js
const instance = new Cesium.GeometryInstance({
  geometry: new Cesium.RectangleGeometry({
    rectangle: Cesium.Rectangle.fromDegrees(110, 20, 118, 27),
    height: 10000, // 椭球高,米;没有贴地语义
    vertexFormat: Cesium.PerInstanceColorAppearance.VERTEX_FORMAT,
  }),
  attributes: {
    color: Cesium.ColorGeometryInstanceAttribute.fromColor(Cesium.Color.TEAL),
  },
});
viewer.scene.primitives.add(new Cesium.Primitive({
  geometryInstances: instance,
  appearance: new Cesium.PerInstanceColorAppearance({ translucent: false }),
}));

这里几何描述形状,实例提供位置变换与实例属性,Appearance 规定如何消费这些属性。三者必须匹配:外观需要法线(normal,垂直于表面的方向),而几何没有提供时,仅靠改变颜色无法补齐缺失输入。

动态不等于每帧重建 ​

少量业务对象和时间属性通常适合 Entity;大量同类静态几何可考虑批处理;需要每帧更新粒子状态或数据纹理时,才逐渐进入专门的 GPU 路径。先测量瓶颈:耗时可能来自属性计算、几何准备、上传或像素填充,优化错层就难以见效。

异步创建 Primitive 可以分摊部分几何准备,但它仍有生命周期。对象尚未准备好时不能假设所有实例属性都可直接操作;删除对象时也要按所属集合和资源所有权处理。

对象如何被画出EXPERIMENT 05 · CESIUM 1.145.0

对象如何被画出

比较 Entity 与 Primitive,查看几何与材质的边界。

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

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

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

读取源码…

观察任务: 在“对象接口”中切换 Entity 与 Primitive,将“几何数量”保持为 16,比较表面外观与拾取结果。仅凭最终外观,能否判断它来自哪条路径?

展开解释

通常不能,两条路径可以产生相同画面。选择依据在数据模型、更新频率与所需控制,而不是视觉风格。应检查数据到绘制的实际链路,再用性能记录验证优化收益。

官方延伸:Primitive、1.145 Entity 可视化入口。

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