在Cesium中,Primitive
和 Entity
是两种不同的可视化数据模型,主要区别在于抽象层级、使用场景和性能优化:
核心区别总结
维度 | Entity | Primitive |
---|---|---|
抽象层级 | 高级API(面向业务) | 低级API(面向图形渲染) |
设计目标 | 简化开发,支持动态数据 | 极致性能,直接控制GPU渲染 |
动态数据支持 | ✅ 内置Property系统(自动插值/动画) | ❌ 需手动更新顶点/属性数据 |
性能优化 | 自动管理(中小规模数据) | ✅ 支持Instance批量渲染(10W+级数据) |
代码复杂度 | 简单(5行代码创建对象) | 复杂(需理解几何体、材质、渲染流程) |
自定义能力 | 受限(依赖内置材质) | ✅ 完全自定义Shader/GLSL |
生命周期管理 | 自动(viewer.entities 自动销毁) | 手动(需显式destroy() ) |
关键差异详解
1. 抽象层级与易用性
-
Entity
封装了图形(Point/Billboard/Polygon等)与行为(位置/颜色/轨迹的Property对象)。// Entity示例:创建一个动态移动的点 const entity = viewer.entities.add({ position: Cesium.Cartesian3.fromDegrees(0, 0), point: { pixelSize: 10, color: Cesium.Color.RED }, velocity: 10 // 可通过Property驱动 });
-
Primitive
直接操作几何体(Geometry)与外观(Appearance),需处理底层渲染细节。// Primitive示例:创建一个三角形 const primitive = new Cesium.Primitive({ geometryInstances: new Cesium.GeometryInstance({ geometry: new Cesium.PolygonGeometry({ /* 手动计算顶点 */ }), }), appearance: new Cesium.PerInstanceColorAppearance() }); viewer.scene.primitives.add(primitive);
2. 动态数据支持
-
Entity
通过Property
系统实现动态效果(如随时间变化的轨迹):entity.position = new Cesium.SampledPositionProperty(); entity.position.addSample(time, position); // 自动插值计算中间位置
-
Primitive
更新数据需重建整个Primitive(或使用GeometryInstance
属性更新),无内置插值能力。
3. 性能关键点
-
Entity的瓶颈:
每个Entity独立渲染 → 实体过多时Draw Call激增 → 性能下降(>1,000实体需谨慎)。 -
Primitive的优势:
支持将多个GeometryInstance
合并为一次Draw Call(实例化渲染):const primitive = new Cesium.Primitive({ geometryInstances: [instance1, instance2, ...], // 合并10W个实例 appearance: new Cesium.PerInstanceColorAppearance() });
4. 适用场景
- 用Entity当:
“需要快速实现动态对象(如飞机、船舶)、时间相关数据可视化(如轨迹回放),或处理交互式业务数据(如点击弹窗)。” - 用Primitive当:
“渲染静态/海量数据(如地形建筑、电网管线)、需要自定义着色器效果(如热力图、流光效果),或极端性能优化场景(如百万级点云)。”
总结:
Entity实际是由Primitive实现的!调用viewer.entities.add()
时,Cesium内部自动创建对应的Primitive。大型项目通常组合两者:用Primitive
渲染静态背景层(如地图网格),用Entity
管理动态对象。若需显示全国10万个静态建筑物:用Primitive+GeometryInstance
合并渲染,比Entity性能高。