2016-07-30 75 views
0

我試圖製作一個視頻遊戲引擎,它必須運行render函數作爲循環。當此功能完成後,我想再次運行它,又一次,又一次......但是當我嘗試這樣的:無限次運行函數

function render() { 
    // some code here which takes ~ 0.00015 second to run 
} 

while(1) { render(); } 

在幾秒鐘的瀏覽器凍結。所以,我已經試過另一種方式:

function render() { 
    // some code here which takes ~ 0.00015 second to run 
} 

setTimeout(render); 
// I've tried also 
setTimeout(render, 1); 

另外:

function render() { 
    // some code here which takes ~ 0.00015 second to run 

    setTimeout(render); 
    // OR 
    setTimeout(render, 1); 
} 

但是執行功能的第二隻〜500倍,我要運行它〜5000倍。如果我查看運行時間(0.00015秒),這是可能的,但我找不到一種方法來實現這一點。

有沒有人有想法?

+6

嘗試使用['requestAnimationFrame'](https://developer.mozilla.org/en-US/docs/Web/API/window/requestAnimationFrame),但是如果你已*獲得500 fps,爲什麼需要更多? –

+0

@Lucas Trzesniewski:你應該重新發布這個答案。 – doctorless

+1

@drheart某人已經FGITWed那一個,但說實話,我很懷疑OP的500 fps數字;) –

回答

3

你想要做的是使用window.requestAnimationFrame這樣:

function render() { 
    window.requestAnimationFrame(render); 
} 

window.requestAnimationFrame(render); 

你永遠無法調用的「無限」的金額,這將取決於您的硬件有多強。您還可以輕鬆計算出「增量時間」(在兩個連續的render調用之間經過的時間量),以使遊戲動畫順利地適用於任何用戶,無論他們的硬件是什麼。

+0

通過計算運行'render'函數所需的時間,我可以看到無論我使用什麼(requestAnimationFrame,setInterval),我都無法一次運行5000次函數。但它應該是可能的,我不明白爲什麼它不起作用。對於'window.requestAnimationFrame'方式,最大設置爲60 fps,但不允許減少「增量時間」。 我會嘗試測量我測試的不同方式的增量時間,並在明天在這裏發佈報告。 – ClementNerma

+0

(對不起,遲了)經過幾次測試,delta時間(奇怪地)是requestAnimationFrame的兩倍,而不是一個簡單的setTimeout(這不是'setInterval'我編輯了我的問題)。當我在屏幕上放置4000個多邊形時,FPS使用'setTimeout'方式大約高出2倍...... – ClementNerma