铯1.7+中的异步实体渲染

时间:2015-03-10 22:10:47

标签: cesium

美好的一天,

我现在已经和Cesium合作过了一段时间,当我开始使用Primitive Collections时,我就开始了。我点击并拖动原始渲染工作,但现在我想升级Cesium并转移到实体。我移动了代码,重构了,可以点击并拖动来绘制形状;然而,在我能够翻转异步标志之前,它会在我移动鼠标时呈现。现在,我无法做到这一点。我尝试设置' allowDataSourcesToSuspendAnimation'在观众身上虚假,但无济于事。任何帮助都将非常感激。

在我天真的时候,我忘记在我的问题中添加一个代码段。这是一个时钟滴答事件监听器,仅在发生鼠标停止时触发(布尔值设置为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;
                                }

1 个答案:

答案 0 :(得分:0)

在我看来,你做了太多工作来更新实体。您只需要设置已更改的值,并且只有在更改足够大以保证图形更新时才应该这样做。尝试使用以下内容替换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;

当您拖动选择椭圆时,这会阻止地球旋转。您可以在鼠标移动时将其重置为true