【问题标题】:How to implement renderer with respect to CPU capabilities如何实现与 CPU 功能相关的渲染器
【发布时间】:2011-02-25 18:48:20
【问题描述】:

我想知道在 JavaScript 中实现渲染器的最佳方式是什么。这里真正重要的不是渲染的内容部分——我更想知道何时以及如何有效地运行渲染器代码。

目前,我有 window.setInterval(renderFunc, 1000 / 20),它只会每 50 毫秒渲染一帧(即 fps = 20)。

关键是更快的计算机不会渲染更多的帧,而且更慢的计算机将无法赶上 20 fps,因此该函数的调用次数超出了计算机的处理能力。

我正在考虑一个while(true) 循环,但这会占用 100% 的 CPU 并且会冻结计算机本身 - 所以实际上我的游戏(渲染器是我的 3D 游戏)将不再可玩,因为你不能不再点击按钮。

在这种情况下,最有效的选择是什么,或者我还没有想到更好的方法?

提前致谢。

【问题讨论】:

    标签: javascript rendering cpu


    【解决方案1】:

    有一个专门为动画制作的功能,称为window.requestAnimationFrame。这意味着浏览器选择何时调用动画函数而不是硬编码间隔。使用它有很多好处:

    • 更快的计算机将获得更高的帧速率
    • 不可见的窗口/选项卡更新频率大大降低
    • 根据 CPU 使用情况改变帧速率

    这篇文章解释了如何以跨浏览器的方式使用它: http://paulirish.com/2011/requestanimationframe-for-smart-animating/

    文章还链接到http://jsfiddle.net/paul/XQpzU/2/

    【讨论】:

    • 这看起来真的非常有趣!
    • 它似乎无法在 Chrome 上使用,而我正在将游戏制作为仅限 Chrome……很遗憾。
    • jsFiddle 示例在 Chrome 中运行良好...哎呀,不...它使用备份方法,尝试使用 setTimeout 获得 60 fps
    • 只是想让您知道最新的 Chromium 构建包含 webkit 版本 - 请参阅 code.google.com/p/chromium/issues/detail?id=64848。它只是在谷歌浏览器中还不可用。
    • 不过,在我看来,setInterval 至少在 Chrome 中更流畅。
    【解决方案2】:

    您可以计算帧渲染所需的时间,并调整帧间距以实现可接受的负载。例如,如果您的当前帧需要 5 毫秒来渲染,并且您想要 50% 的负载,请在下一帧之前等待 5 毫秒。您需要对其进行一些健全性检查,并且可能还需要使用最后几帧的时间。

    【讨论】:

    • 我喜欢你的想法,但另一方面它也取决于其他正在运行的应用程序。大多数游戏每秒的 fps 都在变化,具体取决于特定时刻可用的当前 CPU 功率。
    • @pimvdb:嗯,确实在立即减慢(因此微小的光点会导致帧速率下降)和立即响应更高负载之间进行权衡......这可以通过要平均的历史数量。除此之外,我不确定您在说什么;可用的 CPU 功率(在特定时刻)为 0% 或 100%:您要么被安排在那个时间片上,要么你没有。 (此处忽略 CPU 频率缩放)
    • 我的意思是 Windows 上的任务管理器显示的 CPU 使用率介于 0% 和 100% 之间。当我启动其他吸收 CPU 功率的应用程序时,游戏剩余的可用帧数会降低游戏的 fps(并且在任务管理器中的百分比更大)。我可以在加载游戏时测量 CPU 使用率,但结果可能会在一段时间后其他应用程序也运行时变得过高。
    • @pimvdb:嗯,这就是使用最近帧计时的美妙之处。如果您的系统负载增加,渲染帧的时间也会增加(假设您的帧渲染占负载的很大比例),因此您会自动降低帧速率。
    • 是的 - 我当然可以每秒测量一次,以便选择要渲染的最佳帧数。谢谢。
    【解决方案3】:

    考虑在 Web 工作线程内尝试 while(true) 循环。这应该可以防止浏览器锁定。请注意,您不能从工作线程中直接操作 <canvas> 或 DOM 的任何其他部分。

    https://developer.mozilla.org/En/Using_web_workers

    【讨论】:

    • 看起来确实很有趣,谢谢。但是,while(true) 不会仍然以这种方式使用完整的 CPU 能力吗?
    • 这取决于您如何定义完整的 CPU 能力。一个线程只能使用 CPU 的一个核心,所以除非你运行的是 Pentium 4 或其他东西,否则这应该不是什么大问题。您还可以使用某种指标来确定在setInterval 调用中使用的间隔有多小。
    • 顺便说一句,是否有可能使用 JavaScript 获取当前的 CPU 使用率?
    【解决方案4】:

    “setInterval() 将传递回调被调用延迟的毫秒数” -- https://developer.mozilla.org/en/window.setInterval

    您可以使用它来动态调整间隔时间。

    注意MDC 文档适用于 Mozilla 实现的 Javascript,而不是 ECMA 脚本或其他实现。您应该检查这是否适用于其他浏览器。

    【讨论】:

    • 非常感谢您的建议,但这基本上是基于每个负载的检查,也就是说,在其他应用程序玩游戏期间,CPU 的使用可能会越来越少。我也可以每隔这么多秒测量一次,但我猜这不太实用。
    猜你喜欢
    • 1970-01-01
    • 2018-05-03
    • 2022-01-05
    • 2019-05-09
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 2011-04-06
    • 1970-01-01
    相关资源
    最近更新 更多