首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >功能开始或结束时的requestAnimationFrame?

功能开始或结束时的requestAnimationFrame?
EN

Stack Overflow用户
提问于 2016-07-06 08:47:23
回答 4查看 5.4K关注 0票数 21

如果我有一个像这样使用requestAnimationFrame的循环:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function render() {
    // Rendering code

    requestAnimationFrame(render);
}

如果我将requestAnimationFrame放在函数的开头,会有什么不同,比如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function render() {
    requestAnimationFrame(render);

    // Rendering code
}

我没有注意到有什么不同,但我看到了这两种实现,它们中的一种在任何方面都更好,还是它们是相同的呢?

编辑:我想过的一件事是,如果我把它放在开头,并且渲染代码需要相当长的时间来运行,比如说10 is,那么将它放在最后不会使10 is的帧率下降吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2016-07-06 08:59:08

requestAnimationFrame总是异步调用它的回调,所以只要您的呈现代码是同步的,并且不抛出异常,就不会有任何区别。

这基本上是一个风格的选择,选择自己的方法更干净。将其放在顶部可能会强调render正在调度自己,即使在呈现过程中出现错误时也是如此。将其放在底部允许有条件地脱离呈现循环(例如,当您想暂停游戏时)。

票数 20
EN

Stack Overflow用户

发布于 2016-07-06 09:19:04

很可能不会有任何变化。requestAnimationFrame方法是异步的,因此无论哪种方式,您的呈现函数都将按预期工作。但是..。停下来的时候有个陷阱。假设您有以下代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function render() {
    requestAnimationFrame(render);
    // Rendering code
}

为了停止下一个呈现,需要调用cancelAnimationFrame方法,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function render() {
    requestAnimationFrame(render);
    // Rendering code
    if (noLongerInterested) {
        cancelAnimationFrame();
    }
}

否则,render方法就会无限期地运行。或者,你也可以这样做:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function render() {
    // Rendering code
    if (stillInterested) {
        requestAnimationFrame(render);
    }
}

至于帧丢弃,您可以将requestAnimationFrame看作是一个固定的时间表(以每秒60帧的速度,大约是16 As的间隔)。如果您的代码花费更长的时间,浏览器将开始删除框架。有关如何负责框架的说明,请查看帕特里克·罗伯茨的回答,并使用它进行更一致的呈现。

我希望这能帮上忙!

票数 6
EN

Stack Overflow用户

发布于 2016-07-06 09:23:55

为了回答您的问题,这两个函数只在呈现代码超过动画帧速度(通常为16-33ms左右,取决于浏览器实现)时,才会改变异步回调所需的时间。但是,如果您按照预期使用这个API,那么即使这样也不会有什么不同。

请注意,您选择不使用从requestAnimationFrame传递的可选参数-- timestamp

如果您有任何与增量时间相关的动画要渲染,请确保计算三角形。通常,将动画的“速度”与timestamp增量(当前的timestamp减去以前的timestamp)相乘,以获得对象应该在屏幕上传播的有效距离。当您的呈现代码没有始终如一地花费相同的时间来执行每个帧时,它的效果尤其明显。

演示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var untimed = 20;
var timed = 20;

function untimedRender() {
  var then = performance.now() + Math.random() * 100;

  while (performance.now() < then) {}
  
  // estimated velocity
  untimed += 50 / 30;
  
  document.querySelector('#untimed').style.left = Math.min(Math.floor(untimed), 200) + 'px';
  
  if (untimed < 200) {
    requestAnimationFrame(untimedRender);
  } else {
    last = performance.now();
    requestAnimationFrame(timedRender);
  }
}

var last;

function timedRender(timestamp) {
  var delta = timestamp - last;
  var then = timestamp + Math.random() * 100;
  
  last = timestamp;

  while (performance.now() < then) {}
  
  // calculated velocity
  timed += delta / 30;
  
  document.querySelector('#timed').style.left = Math.min(Math.floor(timed), 200) + 'px';
  
  if (timed < 200) {
    requestAnimationFrame(timedRender);
  }
}

requestAnimationFrame(untimedRender);
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
div {
  position: absolute;
  left: 20px;
  width: 10px;
  height: 10px;
}

#untimed {
  background-color: #F00;
  top: 20px;
}

#timed {
  background-color: #00F;
  top: 50px;
}
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<div id="untimed"></div>
<div id="timed"></div>

注意,蓝色方格似乎保持了一个更一致的整体速度。这就是目的所在。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38229386

复制
相关文章
Golang获取过去或将来某周某月的开始时间戳和结束时间戳
Golang获取过去或将来某周某月的开始时间戳和结束时间戳 开发过程中我们经常需要拿到相对于当前时间过去或将来的某周某月的开始和结束时间戳,下面为大家准备了对应的方法。 1.获取某周的开始和结束时间戳 // 获取某周的开始和结束时间,week为0本周,-1上周,1下周以此类推 func WeekIntervalTime(week int) (startTime, endTime string) { now := time.Now() offset := int(time.Monday - no
用户6786882
2021/11/19
3.3K0
php获取当天的开始时间和结束时间
//当天开始时间 $start_time=strtotime(date("Y-m-d",time())); //当天结束之间 $end_time=$start_time+60*60*24; echo $start_time; 1541001600 echo $end_time; 1541088000 $start_time=date("Y-m-d H:i:s",$start_time); $end_time=date("Y-m-d H:i:s",$end
超级小可爱
2023/02/20
2K0
java根据开始时间和结束时间,计算出时间工作日天数(包含开始和结束时间)
public int weekDay(String strStartDate, String strEndDate) { //strStartDate:"2019-10-25",strEndDate:"2019-12-10" SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); Calendar clOne = Calendar.getInstance(); Calendar clTwo = Calendar.getInstance(); try { clOne.setTime(df.parse(strStartDate)); clTwo.setTime(df.parse(strEndDate)); } catch (ParseException e) { System.out.println("日期格式非法"); e.printStackTrace(); } int days = 0; while (clOne.compareTo(clTwo) <= 0) { if (clOne.get(Calendar.DAY_OF_WEEK) != Calendar.SATURDAY && clOne.get(Calendar.DAY_OF_WEEK) != Calendar.SUNDAY) days++; clOne.add(Calendar.DAY_OF_MONTH, 1); } return days; }
botkenni
2019/11/10
2.6K0
requestAnimationFrame 的 Bug?
今天有一位同学,在群里问了这一个问题:requestAnimationFrame 的执行机制如何
落落落洛克
2021/05/24
1.3K0
requestAnimationFrame 的 Bug?
mysql在开始与结束时间过滤出有效的价格且结束时间可以为空
在商品配置中设置有售卖时间,同一个商品可以设置多组不同的售卖时间,其中开始时间必填,结束时间可以不填,但是同一时刻只会有一个正在生效的时间区间。
翎野君
2023/05/12
5180
requestAnimationFrame简介
当我们写window.requestAnimationFrame(回调函数)时,浏览器会在下次重绘前执行回调函数。
前端GoGoGo
2018/08/27
8820
requestAnimationFrame简介
遇见requestAnimationFrame
今天,在读javascript异步编程的js事件深入理解部分的时候,了解到了requestAnimationFrame 这个api,在这里记录一下。 原文: setTimeout 和 setInterval 就是些不精确的计时工具。在Node中,如果只是想产生一个短时延迟,请使用 process.nextTick。在 浏 览 器 端 , 请 尝 试 使 用 垫 片 技 术 (shim ) ③ : 在 支 持requestAnimationFrame 的 浏 览 器 中 , 推 荐 使 用requestAni
吴裕超
2018/03/29
8890
requestAnimationFrame的使用
在Web应用中,实现动画效果的方法比较多,JavaScript 中可以通过定时器 setTimeout 来实现,css3 可以使用 transition 和 animation 来实现,html5 中的 canvas 也可以实现。除此之外,html5 还提供一个专门用于请求动画的 API,即  requestAnimationFrame(rAF),顾名思义就是 “请求动画帧”。 为了深入理解  rAF 背后的原理(后文的 rAF 均指的是 requestAnimationFrame),我们首先需要了解一下与之相关的几个概念:
javascript.shop
2019/09/04
1.1K0
Python获取昨天、今天、明天开始、结束时间戳
Python获取昨天、今天、明天开始、结束时间戳 # coding=utf-8 import time import datetime # 今天日期 today = datetime.date.today() # 昨天时间 yesterday = today - datetime.timedelta(days=1) # 明天时间 tomorrow = today + datetime.timedelta(days=1) acquire = today + datetime.timedelta(day
wo.
2021/06/15
5.3K0
setTimeout和requestAnimationFrame
JavaScript语言的一大特点就是单线程,也就是说,同一时间只能做一件事,前面的任务没做完,后面的任务只能等着。
木子星兮
2020/07/16
1.8K0
设置时间laydate 结束时间大于开始时间
其实就是在结束时间框里设置开始时间的最大时间 在开始时间框里设置结束时间的最小时间 具体代码如下 layui.use(['form', 'laydate'], function(){ var form = layui.form; var laydate = layui.laydate; //日期范围 var startDate=laydate.render({ elem: '#start_time',
Erwin
2020/01/08
1.9K0
Django model 数据约束 结束时间大于开始时间
数据模型: class Task(models.Model): taskStartTime = models.DateTimeField(verbose_name='开始时间') taskEndTime = models.DateTimeField(verbose_name='结束时间') def __str__(self): return self.taskName 添加约束: class Task(models.Model): taskStart
SingYi
2022/07/13
5560
Django model 数据约束 结束时间大于开始时间
PHP 获取指定年月日的开始和结束时间戳 转
以上就是PHP 获取指定年月日的开始和结束时间戳的全文介绍,希望对您学习和使用php有所帮助.
双面人
2019/04/10
2.7K0
时间控件设置开始时间不大于结束时间
<div class="form-horizontal fl"> <div class="control-group"> <label class="control-label">生成时间</label> <input type="text" size="12" readonly="readonly" name="beginDate" id="starttime" value="" class="Wdate" onClick="WdatePicker({dateFm
用户1220053
2018/02/09
1K0
使用 requestAnimationFrame 实现动画
首先想到的是 setInterval/setTimeout,原理就是利用人眼的视觉残留和电脑屏幕的刷新,让元素以连贯平滑的方式逐步改变位置,最终实现动画的效果。
李振
2021/11/26
9910
requestAnimationFrame 执行机制探索
上面的代码 1s 大约执行 60 次,因为一般的屏幕硬件设备的刷新频率都是 60Hz,然后每执行一次大约是 16.6ms。使用 requestAnimationFrame 的时候,只需要反复调用它就可以实现动画效果。
winty
2021/11/24
1.2K0
requestAnimationFrame 执行机制探索
Java获取当天、当前月、当前年(今年)的开始和结束时间戳
最近在做统计相关的功能的时候涉及到了获取当天的开始和结束的时间戳、当月和当年的开始结束时间戳,特此记录,以作备忘。
翎野君
2023/05/12
3.2K0
Java获取当天、当前月、当前年(今年)的开始和结束时间戳
requestAnimationFrame实现动画效果
html动画一般会采用css3的形式去做,当然也比较建议用css去做动画。但是有时候一些动画只能使用js来完成,常用的js动画方案是使用计时器来完成。编写动画循环的一个关键在于我们要延迟多长时间比较合适,如何设置时间才能让动画显得平滑顺畅,这个时间并不是越小越好,因为要遛狗足够的时间间隔来让浏览器产生渲染变化,否则就会变成跳跃感。
OECOM
2020/07/02
2K0
搜索框和数据库均有开始时间和结束时间的sql
活动表中有两个字段:startDate、endDate,分别代表开始时间、结束时间。现在需要查询某一时间段内正在进行的活动,实际只要满足活动的时间段和查询条件的时间段有交集即可,包含以下图片中的四种情况。使用表达式startDatePara <= endDate && endDatePara >= startDate可以确定
似水的流年
2019/12/05
1.2K0
点击加载更多

相似问题

用于开始CSS转换的requestAnimationFrame

23

使用requestAnimationFrame更有功能

12

如何在激发或即将结束时找到开始和/或结束时间戳

10

从TStopWatch获取开始或结束时间

13

防止线路开始或结束时发生元素

24
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文