第136篇:动画API:setInterval 与 requestAnimationFrame的区别

动画,api,setinterval,requestanimationframe,区别 · 浏览次数 : 39

小编点评

**使用 requestAnimationFrame 的优势:** 1. **流畅定时器:** requestAnimationFrame 的执行频率与浏览器屏幕刷新次数相匹配,保证回调函数在屏幕每一次刷新间隔中只被执行一次,确保不丢帧,动画不卡顿。 2. **合理的时间处理:** requestAnimationFrame 的执行频率由系统时间间隔决定,而定时器则必须等前面的任务完成,因此其执行频率相对有限。 3. **节约资源:** 当页面被隐藏时,定时器仍在后台执行动画任务,而 requestAnimationFrame 的动画刷新会暂停。 **使用 setTimeout 的缺点:** 1. **延迟卡顿:** setTimeout 的执行频率取决于浏览器内核,可能存在延迟卡顿。 2. **执行频率限制:** setTimeout 的执行频率受浏览器内核的限制,可能无法保证回调函数在屏幕每一次刷新间隔中只被执行一次。 **总结:** 使用 requestAnimationFrame 的优势是流畅定时器、合理的时间处理和节约资源。然而,使用 setTimeout 的劣势是可能存在延迟卡顿。

正文

好家伙,书接上文

 

function animate() {     
//请求-动画-框架 requestAnimationFrame( animate ); //改变正方体在场景中的位置,让正方体动起来 cube.rotation.x += 0.01; cube.rotation.y += 0.01; renderer.render( scene, camera ); // 结合场景和相机进行渲染,即用摄像机拍下此刻的场景(最后一步) }

 

 

 

这是一段动画的渲染方案

这里使用了requestAnimationFrame()而没有使用定时器setInterval

 

动画渲染部分为什么不使用定时器setTimeout而使用requestAnimationFrame()?

 

 

window.requestAnimationFrame() 

告诉浏览器——你希望执行一个动画,并且要求浏览器在下次重绘之前调用指定的回调函数更新动画。

该方法需要传入一个回调函数作为参数,该回调函数会在浏览器下一次重绘之前执行

当你准备更新动画时你应该调用此方法。这将使浏览器在下一次重绘之前调用你传入给该方法的动画函数 (即你的回调函数)。

回调函数执行次数通常是每秒 60 次,但在大多数遵循 W3C 建议的浏览器中,回调函数执行次数通常与浏览器屏幕刷新次数相匹配

                                                    ----来自MDN文档

 

说到定时器setInterval,我们又要扯到异步,

js引擎单线程执行的,它是基于事件驱动的语言.它的执行顺序是遵循一个叫做事件队列的机制.
浏览器有各种各样的线程,比如事件触发器,网络请求,定时器等等.线程的联系都是基于事件的.
js引擎处理到与其他线程相关的代码,就会分发给其他线程,他们处理完之后,需要js引擎计算时就是在事件队列里面添加一个任务.
这个过程中,js并不会阻塞代码等待其他线程执行完毕,而且其他线程执行完毕后添加事件任务告诉js引擎执行相关操作.
                            ----来自setTimeout 与 requestAnimationFrame 的区别 - 掘金 (juejin.cn)
 
 
所以说,定时有"被卡住的可能",他必须等前面的任务完成.
而刷新时间变长,帧数就会下降
而requestAnimationFrame采用系统时间间隔,保持最佳绘制效率,不会因为间隔时间过短,造成过度绘制,增加开销;
也不会因为间隔时间太长,使用动画卡顿不流畅,让各种网页动画效果能够有一个统一的刷新机制,从而节省系统资源,改善视觉效果。
 
 
所以我们总结一下:

requestAnimationFrame()优势:

1.requestAnimationFrame()更流畅

定时器setInterval存在延迟卡顿的问题

而使用 requestAnimationFrame 执行动画,能保证回调函数在屏幕每一次刷新间隔中只被执行一次,

确保不丢帧,动画不卡顿

 

2.requestAnimationFrame()更合理

定时器setInterval的执行频率由时间决定

而requestAnimationFrame()的执行频率与浏览器屏幕刷新次数相匹配

 

3.节约资源

当页面被隐藏时,定时器 setInterval 仍在后台执行动画任务

而requestAnimationFrame()的动画刷新会暂停

 
 
 

 

与第136篇:动画API:setInterval 与 requestAnimationFrame的区别相似的内容:

第136篇:动画API:setInterval 与 requestAnimationFrame的区别

好家伙,书接上文 function animate() { //请求-动画-框架 requestAnimationFrame( animate ); //改变正方体在场景中的位置,让正方体动起来 cube.rotation.x += 0.01; cube.rotation.y += 0.01; re

Iframe在Vue中的状态保持技术

Iframe是一个历史悠久的HTML元素,根据MDN WEB DOCS官方介绍,Iframe定义为HTML内联框架元素,表示嵌套的Browsing Context,它能够将另一个HTML页面嵌入到当前页面中。Iframe可以廉价实现跨应用级的页面共享,并且具有使用简单、高兼容性、内容隔离等优点,因此以Iframe为核心形成了前端平台架构领域第1代技术。

第一百零五篇:变量的原始值和引用值

好家伙,JS基础接着学, 本篇内容为《JS高级程序设计》第四章学习笔记 1.原始值和引用值 ECMAScript变量可以包含两种不同类型的数据:原始值和引用值。原始值(primitive value)就是最简单的数据,引用值(reference value)则是由多个值构成的对象。 在把一个值赋给变

第一百零六篇:变量的不同声明(var,let和const的不同)

JS关于变量的声明,变量提升,暂时性死区

第一百零七篇:基本数据类型(undefined,null,boolean类型)

好家伙, 本篇内容为《JS高级程序设计》第三章学习笔记 1.数据类型 ECMAScript有6种简单数据类型(称为原始类型): Undefined, Null, Boolean, Number, String和Symbol。 Symbol (符号)是ECMAScript6新增的。还有一种复杂数据类型

第一百零八篇:最常用的基本数据类型(Number类型)

最常用的基本数据类型(Number类型)

第一百一十篇:内存泄漏和垃圾回收(JS)

好家伙,本篇内容为《JS高级程序设计》第四章的学习笔记 1.内存泄露 1.1.什么是内存泄漏? 内存泄漏(Memory Leak)是指程序中已动态分配的堆内存由于某种原因程序未释放或无法释放,造成系统内存的浪费,导致程序运行速度减慢甚至系统崩溃等严重后果。 内存泄漏缺陷具有隐蔽性、积累性的特征,比其

第一百一十一篇:基本引用类型Date

好家伙,本篇为《JS高级程序设计》第五章的学习笔记 1.基本引用类型 引用值(或者对象)是某个特定引用类型的实例,在ECMAScript中,引用类型是把数据和功能组织到一起的结构,(像极了“类”) 经常被人错误的称作“类”。 虽然从技术上讲JavaScript是一门面向对象语言,但是ECMAScri

第一百一十二篇: JS数组Array(一)数组基本用法

好家伙, 1.数组 Array应该就是ECMAScript中最常用的类型了。ECMAScript数组跟其他编程语言的数组有很大区别。 跟其他语言中的数组一样,ECMAScript 数组也是一组有序的数据, 但跟其他语言不同的是,数组中每个槽位可以存储任意类型的数据。 这意味着可以创建一个数组,它的第

第一百一十四篇: JS数组Array(三)数组常用方法

好家伙,本篇为《JS高级程序设计》第六章“集合引用类型”学习笔记 1.数组的复制和填充 批量复制方法 copyWithin(),以及填充数组方法fill()。 这两个方法的函数签名类似,都需要指定既有数组实例上的一个范围,包含开始索引,不包含结束索引。 使用这个方法不会改变数组的大小。 1.1.fi