【问题标题】:using setTimeout vs comparing timestamp on an update loop使用 setTimeout 与比较更新循环上的时间戳
【发布时间】:2015-05-29 06:40:19
【问题描述】:

使用 Javascript,在使用更新函数的应用程序中运行每个渲染帧并寻求每分钟的优化:

如果想要经常运行代码并且时间的精度并不重要,那么在使用setTimeout 循环还是在应用程序的更新函数中构建一个计时器之间是明智的选择吗?

例如,setTimeout 是否有一些意想不到的计算成本,使其明显变慢?或者,另一方面,setTimeout 是否会对应用程序产生积极影响,因为 Javascript 并不急于使 setTimeout 回调发生?

【问题讨论】:

  • 只有一个线程,所以使用while (true) 循环是一个非常糟糕的主意。另一方面,setTimeout 只会在线程准备好后立即执行回调——这可能是从您设置为 setTimeout 的确切时间到从不执行的任何时间(如果您的应用程序中有 while (true) 循环: ))。
  • 没有while(true),但是有一个整体更新循环,它被尽可能频繁地调用而不会被太频繁地调用;游戏中常见。所以我想问题是是检查循环中我已经需要运行的时间还是单独使用setTimeout
  • 试试这个 - playmycode.com/blog/2011/08/…。它有点旧,但仍然适用。 setInterval 是比setTimeout 更好的选择,如果浏览器支持window.requestAnimationFrame,那就更好了。或isaacsukin.com/news/2015/01/…。或者只是谷歌“实时javascript游戏循环”。
  • 抱歉,我不清楚;我正在构建的实际应用程序在其开发中已经相当成熟。目前,我有一个使用requestAnimationFrame 运行更新功能的HTML5 应用程序。我正在寻找的是一些晦涩难懂的(也许是未知的)知识——在非常低的水平上——在检查更新循环中的时间差或使用单独的 setTimeout/setInterval 循环之间更快。

标签: javascript performance time


【解决方案1】:

使用时间戳差异优于setTimeout,但您仍然需要渲染循环。因此,您可以使用requestAnimationFrame 发送的时间戳差异作为回调函数的参数。

我希望这能回答你的问题。

还请记住(正如您所提到的),setTimeout 被推迟到堆栈调用的末尾。这就是为什么在 node.js 中你有其他“延迟”函数的方法,而且你有一种更快的方法来计算时间戳差异,使用 process.hrtime 而不必使用 Date 对象。

长答案短是:

使用requestAnimationFrame发送的参数给回调。

【讨论】:

    猜你喜欢
    • 2012-07-09
    • 2021-08-17
    • 2021-03-31
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 2011-06-06
    相关资源
    最近更新 更多