我們都知道,如果某些fps很重要,或者類似這樣的話,制定正確的更新算法是多麼困難。使用while(Date.now()<interval){}與requestAnimationFrame()
無論如何,我只是想到了這個無限循環的黑客,它只是凍結了程序,直到下一幀,而且它看起來工作得很完美。
var then = Date.now()
var fps = 40;
var interval = 1000/fps;
function mainloop() {
while (Date.now() - then < interval) {} // freezes program until next frame
requestAnimationFrame(mainloop);
then = Date.now();
// update logic goes here
}
mainloop();
我還沒有在任何地方看過這個解決方案,所以我想問問它是否乾淨和正確。我知道凍結程序只是爲了等待一些東西,而這段代碼看起來很糟糕,但它似乎有效。有沒有一種更清潔的解決方案可以和我的代碼一樣工作?
好吧,冷凍很少會被認爲是正確的。我認爲針對某個fps是一個不好的方法,而是儘可能渲染儘可能多的fps,並相應地調整動畫。意思是,不是針對特定的時間間隔,而是確定自上一幀渲染以來已過去了多長時間,並相應地進行了動畫處理。 – jishi
問題是我需要每個幀都是相同的,我不能製作任何「更長」或「更短」的幀,並且我還需要程序以某種速度運行,因爲音樂同步等。 – BoltKey
我認爲我所說的術語稱爲基於三角洲的動畫。您不必進行固定的框架更改,而是可以開始和結束,並能夠計算在某些時間點應該發生的更改。 – jishi