Javascript - 无法调整帧率 - requestanimationframe

标签 javascript html canvas requestanimationframe

开始循环

function gameLoop(){
   update();
   draw();
   requestAnimFrame(gameLoop);
}

var requestAnimFrame =  window.requestAnimationFrame ||
                    window.webkitRequestAnimationFrame ||
                    window.mozRequestAnimationFrame ||
                    window.oRequestAnimationFrame ||
                    window.msRequestAnimationFrame ||
                    function(callback) {
                        window.setTimeout(callback, 1000 / 1);
                    };
  1. 我无法调整帧速率。它总是非常快。为什么我不能将其更改为每秒 1 帧。我想这样做只是为了测试目的。
  2. 我每次都必须清除 Canvas 吗?它似乎在不清除它的情况下工作良好。

谢谢。

这里是完整代码的 fiddle 链接: complete code

谢谢

最佳答案

rAF 锁定到监视器的同步,通常为 60 Hz,因此我们无法自行调整 FPS(浏览器可能会在选项卡处于非事件状态或使用电池时降低 FPS)。

此外,您要更改的是 poly-fill 的后备;也就是说:如果浏览器不支持 rAF,它将改为使用 setTimeout。然而,如今大多数浏览器确实支持 rAF(甚至没有前缀),因此永远不会使用 setTimeout

你可以做两件事:

  • 直接使用 setTimeout 替换循环中的 rAF(测试时)

例子:

var FPS = 1;

function testLoop() {

    ... ordinary code

    setTimeout(testLoop, 1000/FPS);
}
  • 使用计数器调节 rAF:

例子:

var framesToSkip = 60,
    counter = 0;

function loop() {

    if (counter < framesToSkip) {
        counter++;
        requestAnimationFrame(loop);
        return;
    }

    /// do regular stuff

    counter = 0;
    requestAnimationFrame(loop);
}

MODIFIED FIDDLE HERE

很可能有更好的方法来实现节流,但我只是想展示基本原理。这仍将以 60 FPS 全速运行,但您的代码将执行最少的操作,并且只有当计数器达到其计数时,它才会执行主代码。

如果您接下来绘制的内容会覆盖之前绘制的内容,或者您​​当然想保留它,则无需每次都清除 Canvas 。如果需要,您还可以清除一部分以进一步优化。

关于Javascript - 无法调整帧率 - requestanimationframe,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19000109/

相关文章:

javascript - 使用媒体查询后是否可以更改 html?

javascript - ReactJS的高阶组件错误: "Unknown props"

javascript - MediaElement.js可以用于播放IE6-8,Firefox和Opera的音频吗?

javascript - 将 HTML5 canvas 下载为 pdf

javascript - 检测 JavaScript 中的不可打印字符

javascript - 使模态响应

html - 我应该如何调整网页上的图像大小?

html - CSS 移动表格显示与空表格单元格冲突

javascript - 使用jspdf库将html文件转换为pdf

javascript - 如何旋转 Canvas 中的元素