requestAnimationFrame回调中的参数到底是什么?

弗拉基米尔·尼基

只需运行以下命令:

function requestAndDraw() {
  requestAnimationFrame((t) => {
    console.log(`T: ${t} P.now:${performance.now()}`);
  });
}

intId = setInterval(requestAndDraw, 20);
setTimeout(() => clearInterval(intId), 1000);

它输出如下内容:

T: 1164.656 P.now:1176.300000000083

我想知道12ms差异的原因是什么?花了一些时间执行向requestAnimationFrame注册的其他一些回调这只是解释js的一些开销?要不然是啥?在这种情况下,我不会扔掉12ms的东西。

海道

该参数是一个DOMHighResTimeStamp,就像Performance.now应该返回的一样,即使它不是此方法返回的那个也是如此。


因此,首先让我们解释一下您所看到的精度差异:最近,在大多数CPU中发现了一个主要的安全问题,该问题被称为Meltdown和Spectre
这些攻击可以从Web浏览器来犯,但需要DOMHighResTimeStamp返回由Performance.nowFirefox发现,一种快速修复/“缓解”措施是降低此DOMHighResTimeStamp的分辨率(查看更多)。

由于requestAnimationFrame回调预计火下一帧(即以前的〜电话后16毫秒)的DOMHighResTimeStamp从这个方法传递不需要这种缓解,因此,你仍然有在全精度 DOMHighResTimeStamp


现在要回答标题的问题,传入requestAnimationFrame的回调中的DOMHighResTimeStamp表示此帧的所有回调堆栈的调用时间。
实际上,requestAnimationFrame仅将回调参数存储在堆栈中,然后在发生帧时(恰好在下一个绘画操作之前调用此堆栈
这意味着同一帧的所有回调将共享完全相同的DOMHighResTimeStamp,而无需考虑前一个回调花费了多长时间。

function long(time){
  var now = performance.now();
  console.log('long');
  console.log({
    'rAF time': time,
    'Performance time': now,
    'diff': (now - time) + 'ms'
  });
  console.log('________________________');
  // wait 50ms
  while(performance.now() - time < 50) {
  }
}
function short(time) {
  var now = performance.now();
  console.log('short');
  console.log({
    'rAF time': time,
    'Performance time': now,
    'diff': (now - time) + 'ms'
  });
}
// our two functions will be stacked together to fire in the same frame
requestAnimationFrame(long);
requestAnimationFrame(short);

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

numpy float的“ resolution”参数到底是什么

Android中的ClipData中的“标签”参数到底是什么?

数据表中的sAjaxSource参数到底是什么?

matplotlib 中 yticks/xticks 函数的刻度参数到底是什么?

plot_ly中的z参数到底是什么?

我试图了解币安中的签名查询参数到底是什么

Pygame:Rect()参数到底是什么,它们代表什么?

所有OpenGL纹理调用中使用的“级别”参数到底是什么?

React的createClass的参数到底是什么样的?是物体吗?

slerp的输出四元数到底是什么?

可重入函数到底是什么?

bind_param()中的第一个参数到底是做什么的?

在“回调队列”的上下文中,“空堆栈”到底是什么意思?

SymPy Expression的evaf方法的subs参数到底是什么?就像s.evalf(subs = {...})`吗?

到底是什么“-<”?

AngularJS中的模块到底是什么?

Python中的方法到底是什么?

React中的“ Prop”到底是什么?

Redux中的Middlware到底是什么?

在AWS中,角色到底是什么?

TStream中的元组到底是什么?

EL中的#{component}到底是什么?

Haskell中的“ *”到底是什么?

Fastfile中的代码到底是什么

OpenGL中的VBO到底是什么?

Django中的Meta到底是什么

在 Javascript 中始终将数字作为 64 个浮点数到底是什么意思?

在C ++中,头文件到底是什么,实现文件中到底是什么?

StreamHandler接口中onListen方法中的参数param到底是什么