requestAnimationFrame与setInterva

2021-06-21  本文已影响0人  攻城狮_前端程序媛

参考文档:http://www.zyiz.net/tech/detail-16035.html

编写动画循环时,关键是要知道循环的延迟时间多长合适,即GPU处理生成 每张图片的速度是否和浏览器屏幕刷新频率一致。

如果GPU处理生成每张图片的速度 < 屏幕刷新频率,就会出现多次刷新时显示同一张图片的现象,即用户会感觉动画出现卡顿;

如果GPU处理生成每张图片的速度 > 屏幕刷新频率,就会出现有些图片没有被展示出来,也就是我们说的丢帧现象。

大多数显示器的刷新频率是60Hz,相当于每秒钟重绘60次。

setInterval 定时器

var e = document.getElementById("e");
let left = 0;
let toRight = true 
function render() {
   if(toRight) {
       if(left >= 100) {
            toRight = false;
       }
                
       left++;
   }else{
        if(left <= 0) {
             toRight = true;
         }
         left--;
   }
            
   e.style.left = `${left}px`;
}

setInterval(render, 1000/60);

requestAnimationFrame

var e = document.getElementById("e");
let left = 0;
let toRight = true 
 function render2() {
    if(toRight) {
          if(left >= 100) {
              toRight = false;
           }
           left++;
     }else{
          if(left <= 0) {
              toRight = true;
          }
          left--;
   }
    e.style.left = `${left}px`;           
}

(function loop() {
     render2();
     requestAnimationFrame(loop)
})()

requestAnimationFrame与setInterval的区别?
  1. setInterval动画延迟时间需要手动设置,且执行时间不稳定,无法保证按时绘制每一帧图片

  2. requestAnimationFrame不需要指定帧速率,浏览器内部会自行计算每一帧的执行时间
    -- 当显屏幕示器将一帧画面绘制完成后,在准备读取下一帧之前,显示器会发出一个垂直同步信号(vertical synchronization)给 GPU,GPU收到信号后开始生成新的图片
    -- 即requestAnimationFrame的回调任务会在每一帧的开始时执行

上一篇 下一篇

猜你喜欢

热点阅读