2017-08-06 47 views
3

我想要做的是控制一個非實時 Cesium應用程序的時鐘滴答。想象一下正在運行昂貴的代碼,再加上我希望給觀衆時間來在繼續之前加載分塊。所以如何禁用自動滴答功能,然後在我的代碼準備就緒時手動調用tick()CesiumJS - 我如何控制觀衆時間和滴答聲?

的文檔Cesium.Clock說:「只有當Clock#canAnimate和Clock#shouldAnimate都爲真時鐘纔會打勾。」但那不是我得到的。 我目前看到:

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

回答

0

這是Cesium API的一個遺留怪癖,即時鐘的onTick事件會觸發每個動畫幀的渲染,而不管時鐘是否及時前進。

如果你想利用銫的渲染循環的控制自己,你能做到這一點是這樣的:

viewer.useDefaultRenderLoop = false; 

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

Cesium.requestAnimationFrame(myOwnRenderLoop); 

上面,我使用​​,所以循環運行儘可能地快。但我可以用setTimeout替換它以獲得較慢的循環,模擬較差的渲染性能。請注意,如果使用更長的時間間隔,則交互性和屏幕更新會使用這種方法減慢速度。

viewer.useDefaultRenderLoop = false; 

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

window.setTimeout(myOwnRenderLoop, 500); 
+0

謝謝,這正是我需要的! – maxdownunder

0

因此,您的console.log仍在打印'Tick',因爲onTick會繼續觸發,無論時鐘是否前進。如您所懷疑的,您只需切換canAnimateshouldAnimate即可。所以,你的例子將主要是:

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; 

爲了更好地看到這個動作,試試這個(也許設置如果條件爲1000,而不是100):

viewer.clock.canAnimate = false; 
viewer.clock.shouldAnimate = false; 
var s = 0; 
viewer.clock.onTick.addEventListener(function(clock){ 
    if (s < 100) { 
     console.log(viewer.clock.currentTime); 
    } else { 
     viewer.clock.canAnimate = true; 
     viewer.clock.shouldAnimate = true;   
    } 
    s++; 
}); 

你會看到console.log正在打印相同的值100(或1000)次...這是因爲currentTime沒有前進,因爲canAnimateshouldAnimate。一旦這兩者都切換回true,則currentTime將前進。

+0

謝謝,這是我一直在使用的同時。儘管我之後是emackey提出的解決方案。它可以讓你完全控制滴答/幀週期,所以你仍然可以註冊onTick調用和切換canAnimate等,只是使應用程序非實時(我正在渲染視頻到磁盤)。 – maxdownunder

相關問題