Javascript CesiumJS-如何控制查看器时间和滴答声?

Javascript CesiumJS-如何控制查看器时间和滴答声?,javascript,cesium,Javascript,Cesium,我想做的是控制非实时铯应用程序的时钟滴答声。想象一下,运行的代码很昂贵,而且我想让查看器在继续之前有时间加载分幅。那么如何禁用自动勾选,然后在代码准备就绪时手动调用勾选() 铯原子钟的文件说“只有当时钟和时钟都是真的时,时钟才会滴答作响。”但这不是我得到的。 我现在看到的是: viewer.clock.canAnimate = false; viewer.clock.shouldAnimate = false; viewer.clock.onTick.addEventListener(funct

我想做的是控制非实时铯应用程序的时钟滴答声。想象一下,运行的代码很昂贵,而且我想让查看器在继续之前有时间加载分幅。那么如何禁用自动勾选,然后在代码准备就绪时手动调用勾选()

铯原子钟的文件说“只有当时钟和时钟都是真的时,时钟才会滴答作响。”但这不是我得到的。 我现在看到的是:

viewer.clock.canAnimate = false;
viewer.clock.shouldAnimate = false;
viewer.clock.onTick.addEventListener(function(clock){
    console.log("Tick");
});
控制台中的结果显示时钟仍在滴答作响:

Tick
Tick
Tick
Tick
...
我想做的是:

viewer.clock.stopTicking(); // or whatever that command would be...
while (someCondition){
    // run expensive code
    tick(); // issue manual tick
}
谢谢你的帮助!
Max

因此,您的
控制台.log仍在打印“Tick”,因为无论时钟是否在前进,
onTick
都会继续启动。您只需切换
canAnimate
shouldAnimate
,正如您所怀疑的那样。因此,您的示例代码基本上是:

viewer.clock.canAnimate = false; 
viewer.clock.shouldAnimate = false;
while (someCondition){
    // run expensive code
    // toggle someCondition so we can exit this
}
// set the animate bools back to true so the clock can advance
viewer.clock.canAnimate = true;
viewer.clock.shouldAnimate = true;
为了更好地了解这一点,请尝试以下方法(并可能将if条件设置为1000而不是100):

viewer.clock.canAnimate=false;
viewer.clock.shouldAnimate=false;
var s=0;
viewer.clock.onTick.addEventListener(函数(时钟){
如果(s<100){
console.log(viewer.clock.currentTime);
}否则{
viewer.clock.canAnimate=true;
viewer.clock.shouldAnimate=true;
}
s++;
});

您将看到,
console.log
正在打印相同的值100(或1000)次……这是因为
currentTime
由于
canAnimate
shouldAnimate
而没有前进。一旦这两个都切换回
true
currentTime
将前进。

铯API的一个遗留问题是,无论时钟是否在时间上前进,时钟的
onTick
事件都会为渲染的每个动画帧触发

如果您想自己控制铯的渲染循环,可以这样做:

viewer.useDefaultRenderLoop = false;

function myOwnRenderLoop() {
    viewer.resize();
    viewer.render();
    Cesium.requestAnimationFrame(myOwnRenderLoop);
}

Cesium.requestAnimationFrame(myOwnRenderLoop);
上面,我使用的是
requestAnimationFrame
,因此循环运行得尽可能快。但是我可以用
setTimeout
来代替它,以获得较慢的循环,模拟较差的渲染性能。请注意,当使用较长的时间间隔时,使用这种方法会降低交互和屏幕更新的速度

viewer.useDefaultRenderLoop = false;

function myOwnRenderLoop() {
    viewer.resize();
    viewer.render();
    window.setTimeout(myOwnRenderLoop, 500);
}

window.setTimeout(myOwnRenderLoop, 500);

谢谢,这正是我需要的!谢谢,这是我在这期间一直在用的东西。虽然我所追求的是下面emackey提出的解决方案。它可以让你完全控制滴答声/帧周期,因此你仍然可以注册onTick调用和切换canAnimate等,只需使应用程序非实时(我正在将视频渲染到磁盘)。
viewer.useDefaultRenderLoop = false;

function myOwnRenderLoop() {
    viewer.resize();
    viewer.render();
    window.setTimeout(myOwnRenderLoop, 500);
}

window.setTimeout(myOwnRenderLoop, 500);