在 Cesium 中,this.scene.primitives.add 和 this.viewer.entities.add 都可以用于添加图像或几何体,但它们的本质区别在于底层渲染机制和数据管理方式。
主要区别
| 特性 | scene.primitives.add | viewer.entities.add |
|---|---|---|
| 底层实现 | 直接操作 Primitive API | 通过 Entity API 间接管理 Primitive |
| 数据存储 | 原始 WebGL 资源(Mesh、Geometry、Appearance) | Entity-Component 模型(由 DataSource 维护) |
| 性能 | 更高,直接渲染 | 较低,但更易管理 |
| 适用于 | 高频率更新、大量复杂图形 | 少量动态变化、需要数据管理的对象 |
| 支持功能 | 手动管理几何、材质、纹理、Shader | 内置属性更新(如位置、颜色) |
| 事件管理 | 需要手动监听 | 自带 entity.changed 事件 |
| 拾取/交互 | 需要自己处理 | 直接支持 viewer.selectedEntity |
哪个更适合高频率更新?
如果你需要绘制复杂图像,并且坐标和材质更新频率非常高,那么:
- 推荐使用
scene.primitives.add,因为它直接操作底层 WebGL,性能更高。 viewer.entities.add由于内部数据管理的开销(如EntityCollection和DataSource),更新速度不如primitives快,适用于低频率更新。
为什么 scene.primitives.add 更快?
Primitives直接管理Geometry,避免了Entity层的数据同步开销。Entity在内部使用DataSource,会引入额外的 数据解析 和 对象管理,导致性能损耗。Primitives可以使用 Batching(批量渲染)来优化性能,而Entities需要单独处理。
总结
- 如果追求性能,使用
scene.primitives.add。 - 如果需要方便的属性管理、事件监听,使用
viewer.entities.add。 - 对于高频动态更新(坐标、材质),
primitives更合适。 - 对于较少的对象,并且涉及属性交互、拾取的情况,
entities更方便。
如果你的场景中涉及大量动态变化的点云、实时轨迹线、雷达扫描面等,建议用 Primitive,配合 PrimitiveCollection 和 Appearance 自定义渲染方式。