Cesium中Primitive与Entity的区别

12 阅读2分钟

在Cesium中,Primitive 和 Entity 是两种不同的可视化数据模型,主要区别在于抽象层级、使用场景和性能优化

核心区别总结

维度EntityPrimitive
抽象层级高级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性能高。