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
。
大家好,
我使用 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
。