浏览器计时函数的不精确问题

0 阅读1分钟

计时器能精确计时吗?

不能

  1. 硬件层面: 没有原子钟
  2. 系统层面: 浏览器调用的操作系统的计时函数,操作系统的计时函数本来就有误差(硬件节拍器只能在固定时间间隔检查时间,CPU的多任务抢占)
  3. 标准层面: w3c规定计时器嵌套超过五层的时候,从第六层开始最低计时就是4ms,不足4ms会被补到4ms
  4. 事件循环: 计时器的回调任务放在延时队列中,在计时器计时完成后他需要等主线程的同步任务做完,微队列任务做完,交互队列任务做完,这中间也是误差

替代品:

  1. requestAnimationFrame: 每次操作间隔为一帧,即每次在帧缓冲信号到来之前执行,但是如果当时的JS代码过于复杂可能导致掉帧,那会在下一帧帧执行这一次,即在下一帧先执行这一次的rAF,在执行下一帧本来的rAF,但是如果下一帧也掉帧了那就会继续往后堆积,但是由于都是在一个队列中所以顺序不会乱
  2. Date.now(): 自 1970-01-01 00:00:00 UTC 至今的毫秒数(Unix 时间戳),精度为毫秒级
  3. performance.now() : 从页面导航开始(performance.timing.navigationStart)到当前时间的高精度毫秒数,通常为浮点数(微秒级精度)