首页 > 解决方案 > CesiumJS - 与性能相关的实体/图形层次结构

问题描述

我正在为 CesiumJS 内容开发所见即所得的编辑器。用户将能够创建许多点、线和其他图形,根据可定义的关系将它们连接起来,并将它们分组到单独的组中。

现在我想知道在性能方面的最佳实践是什么。目前我为每个组创建一个 PointPrimitiveCollection,然后添加点:

group.points = scene.primitives.add(new Cesium.PointPrimitiveCollection());

进而

group.points.add({
   position : cartesian,
   ...
});

对于每个新点。

多边形是使用以下方法创建的:

network.hull_polygon = viewer.entities.add({
        name : 'xxx',
        polygon : {
            hierarchy : Cesium.Cartesian3.fromDegreesArray(points_array),
            material : color,
            ...
        }
    });

折线类似。

现在由于对象也可以被拖动/动画,我想知道 Cesiums 实体逻辑会在哪里出现?

感谢大家的帮助!

标签: cesium

解决方案


Cesium 的实体逻辑主要用于随着时间推移沿着已知路径移动的对象,例如未来飞机的飞行计划,或过去车辆所走路线的 GPS 记录。此类路线可以加载到实体系统(通常通过 CZML)中,用户可以以任意速度向前和向后运行模拟时间,以查看所有车辆的路线。实体系统拥有根据模拟时间变化更新图形基元位置的逻辑。

实体也经常被用作使一些不同的图形基元相互关联的快速方法。例如,一个多边形、一个点和一个标签都可以创建为一个单一的Entity,即使它们是位于同一位置的三个单独的图形基元。这节省了应用程序开发人员的一些工作量,并且不会对性能造成太大影响,因为所涉及的属性都被标记为常量,因此实体层知道不使用模拟时间来更新它们。

但是,听起来您可能会遇到事先不知道路径的情况。对于诸如用户交互编辑或接收实时遥测数据之类的事情,Entity 系统无法知道接下来会发生什么,因此它用于从模拟时间更新位置的整个系统对您没有任何好处。在这种情况下,最好跳过实体,并为此专门处理图形基元。这意味着您需要编写自己的更新函数来在接收到新信息时更改图形位置,类似于实体层的更新函数,但基于您自己的实时输入而不是记录的路径。

请注意,公开的“沙堡”演示仅包括实体演示。但是,如果您下载并构建 Cesium 的源代码并从开发构建本地运行 Sandcastle,则会在 Sandcastle GalleryDevelopment中显示一个单独的选项卡,该选项卡显示了基于图形基元而不是实体的一整套演示。这对于查看如何在这一层控制事物的示例很有用。

希望这有助于理解铯的不同层如何相互作用。


推荐阅读