Cesium 1.7+ 中的异步实体渲染

Asynchronous Entity Rendering in Cesium 1.7+

大家好,

我使用 Cesium 已经有一段时间了,我是在使用 Primitive Collections 时开始使用的。我已经单击并拖动了原始渲染工作,但现在我想升级 Cesium 并继续使用实体。我移动了代码,重构了,可以点击和拖动来绘制形状;但是,在我能够翻转异步标志之前,它会在我移动鼠标时呈现。现在,我无法做到这一点。我尝试将查看器上的 'allowDataSourcesToSuspendAnimation' 设置为 false,但无济于事。任何帮助将不胜感激。

由于我的天真,我忘了在我的问题中添加代码片段。这是一个时钟滴答事件侦听器,仅在发生鼠标按下时触发(布尔值设置为 true)

var radius = Cesium.Cartesian3.distance(cartesianStartMousePosition, cartesianMousePosition);
                                if (radius > 0) {

                                    if (currentEntity && currentEntity.id) {
                                        currentEntity.position = cartesianStartMousePosition;
                                        currentEntity.ellipse = {
                                            semiMinorAxis: radius,
                                            semiMajorAxis: radius,
                                            material: new Cesium.ColorMaterialProperty(myColor)
                                        };
                                        currentEntity.label = {
                                            text: 'New Overlay',
                                            scale: 0.35
                                        };
                                        overlayEntities.resumeEvents();
                                    }
                                    else {
                                        currentEntity = new Cesium.Entity({
                                            position: cartesianStartMousePosition,
                                            ellipse: {
                                                semiMinorAxis: radius,
                                                semiMajorAxis: radius,
                                                material: new Cesium.ColorMaterialProperty(myColor)
                                            },
                                            label: {
                                                text: 'New Overlay',
                                                scale: 0.35
                                            },
                                            isSaved: false
                                        });
                                        overlayEntities.add(currentEntity);
                                    }
                                    bDrewPrim = true;
                                }

在我看来,您更新实体的工作量太大了。您只需要设置已更改的值,并且只有在更改足够大以保证图形更新时才应该这样做。尝试将 if 语句的上半部分替换为如下内容:

var lastRadius = 0;

...

if (radius > 0 && !Cesium.Math.equalsEpsilon(radius, lastRadius, Cesium.Math.EPSILON2)) {
    lastRadius = radius;

    if (currentEntity && currentEntity.id) {
        currentEntity.ellipse.semiMinorAxis = radius;
        currentEntity.ellipse.semiMajorAxis = radius;
    } else {
        // Same as before...

我相信椭圆体基元是在工作线程上构建的,因此这段代码试图避免在每个刻度设置新的 radius,除非对其应用了真正的更改。

此外,您没有显示鼠标按下处理程序,但请确保您正在设置此标志(如果您尚未设置):

viewer.scene.screenSpaceCameraController.enableInputs = false;

这会在您拖动-select 椭圆时阻止地球旋转。您可以在鼠标松开时将其重置为 true