requestAnimationFrame的触发频率远高于每秒60帧
requestAnimationFrame fires far more often than 60 fps
我正在使用requestAnimationFrame在mousemove上为页面的一部分设置动画。我刚才遇到的一个问题是,如果鼠标移动事件发生得比预期的每秒60次(我的监视器刷新率)快,它调用绘图代码的频率要高得多。
这似乎取决于你使用的鼠标,但使用我目前的鼠标,如果我移动得相对较快,我可以在同一帧内轻松地获得10个鼠标移动事件。我的理解是,requestAnimationFrame每个帧只应触发绘图函数一次,无论调用频率如何。
现在,在一帧内调用我的绘图代码10次显然对性能来说很糟糕,所以我需要摆脱这种情况。我必须按设计手动处理吗?我对requestAnimationFrame的理解是错误的吗?这是正确的行为,还是我在这里缺少了什么?requestAnimationFrame应该如何工作?
我的理解是,requestAnimationFrame每个帧只应触发绘图函数一次,无论调用频率如何。
这就是你的理解误导你的地方。
requestAnimationFrame
方法实际上会堆叠每个函数,并在同一帧中执行它们。
所以,如果您在同一帧中调用了30次requestAnimationFrame(func)
,那么func
将在下一帧中被调用30次。这些函数似乎甚至被合并到同一个调用中,因为它们共享相同的time
参数。
var funcA = function(time) {
snippet.log('funcA executed at ' + time);
snippet.log('exact time: ' + performance.now())
}
var funcB = function(time) {
snippet.log('funcB executed at ' + time);
snippet.log('exact time: ' + performance.now())
}
snippet.log('funcA stacked at ' + performance.now())
requestAnimationFrame(funcA);
// block the process for some time
var i = 0;
while (i++ < 10000000) {}
snippet.log('funcB stacked at ' + performance.now())
requestAnimationFrame(funcB);
<!-- Provides the `snippet` object, see http://meta.stackexchange.com/a/242144/134069 -->
<script src="http://tjcrowder.github.io/simple-snippets-console/snippet.js"></script>
为了避免这种情况,例如,为了进行反跳,您需要使用一些标记,当rAF执行时,您将释放这些标记。
相关文章:
- 画布动画似乎不会以60帧/秒的速度运行
- 我是否可以在渲染过程中使用三.js合并每一帧中的几何体
- 计划每60秒运行一次代码
- 网络摄像头图片作为背景每60秒更新一次
- requestAnimationFrame的触发频率远高于每秒60帧
- 如何在WebGL中实现每秒帧数
- 优化帮助:使用程序调用每一帧和低FPS
- 每 60 秒仅启动一次事件 (JavaScript)
- 每秒帧数问题
- setTimeout 每 1 秒有效,但不是每 60 秒一次
- 每60秒自动重新加载一次路线
- 如何将击键传播到HTML页面中的每一帧
- 执行javascript,然后每60秒刷新一次脚本
- 在每一帧中选择元素
- 在javascript中,从1000+个结果中计算每60个结果添加到数组中
- 被守护的Node.js每60秒失败一次
- 为什么在三维渲染函数中,while循环不更新每一帧?
- 如何在每60分钟后自动乘上一个数
- jquery每60秒执行一次不同的操作
- 每60秒刷新JSON存储- EXT JS 4