2016-07-30 71 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