如何停止 requestAnimationFrame 递归/循环?

2023-11-30

我使用 Three.js 和 WebGL 渲染器来制作一个游戏,当play链接被点击。对于动画,我使用requestAnimationFrame.

我这样启动它:

self.animate = function()
{
    self.camera.lookAt(self.scene.position);

    self.renderer.render(self.scene, self.camera);

    if (self.willAnimate)
        window.requestAnimationFrame(self.animate, self.renderer.domElement);
}

self.startAnimating = function()
{
    self.willAnimate = true;
    self.animate();
}

self.stopAnimating = function()
{
    self.willAnimate = false;
}

当我想要的时候,我会打电话给startAnimating方法,是的,它确实按预期工作。但是,当我打电话给stopAnimating功能,东西坏了!但没有报告错误...

设置基本上是这样的:

  • 有一个play页面上的链接
  • 一旦用户单击链接,渲染器的domElement应该全屏,而且确实如此
  • The startAnimating方法被调用并且渲染器开始渲染东西
  • 单击转义后,我注册一个fullscreenchange事件并执行stopAnimating method
  • 页面尝试退出全屏,确实如此,但整个文档完全空白

我很确定我的其他代码没问题,而且我正在以某种方式停止requestAnimationFrame以错误的方式。我的解释可能很糟糕,所以我将代码上传到我的网站,你可以在这里看到它发生的情况:http://banehq.com/Placeholdername/main.html.

这是我不尝试调用动画方法的版本,并且全屏输入和输出有效:http://banehq.com/Correct/Placeholdername/main.html.

Once play第一次点击,游戏初始化,start方法被执行。退出全屏后,游戏stop方法被执行。每隔一段时间play已被点击,游戏只执行它的start方法,因为不需要再次初始化它。

它看起来是这样的:

var playLinkHasBeenClicked = function()
{
    if (!started)
    {
        started = true;

        game = new Game(container); //"container" is an empty div
    }

    game.start();
}

这是如何start and stop方法如下:

self.start = function()
{
    self.container.appendChild(game.renderer.domElement); //Add the renderer's domElement to an empty div
    THREEx.FullScreen.request(self.container);  //Request fullscreen on the div
    self.renderer.setSize(screen.width, screen.height); //Adjust screensize

    self.startAnimating();
}

self.stop = function()
{
    self.container.removeChild(game.renderer.domElement); //Remove the renderer from the div
    self.renderer.setSize(0, 0); //I guess this isn't needed, but welp

    self.stopAnimating();
}

这个版本和工作版本之间的唯一区别是startAnimating and stopAnimating method calls in start and stop方法被注释掉了。


启动/停止的一种方法是这样的

var requestId;

function loop(time) {
    requestId = undefined;

    ...
    // do stuff
    ...

    start();
}

function start() {
    if (!requestId) {
       requestId = window.requestAnimationFrame(loop);
    }
}

function stop() {
    if (requestId) {
       window.cancelAnimationFrame(requestId);
       requestId = undefined;
    }
}

工作示例:

const timeElem = document.querySelector("#time");
var requestId;

function loop(time) {
    requestId = undefined;
    
    doStuff(time)
    start();
}

function start() {
    if (!requestId) {
       requestId = window.requestAnimationFrame(loop);
    }
}

function stop() {
    if (requestId) {
       window.cancelAnimationFrame(requestId);
       requestId = undefined;
    }
}

function doStuff(time) {
  timeElem.textContent = (time * 0.001).toFixed(2);
}
  

document.querySelector("#start").addEventListener('click', function() {
  start();
});

document.querySelector("#stop").addEventListener('click', function() {
  stop();
});
<button id="start">start</button>
<button id="stop">stop</button>
<div id="time"></div>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何停止 requestAnimationFrame 递归/循环? 的相关文章

  • 如何在 Windows 网络中的 Intranet Web 应用程序中获取用户的用户名

    我内部有一个简单的 HTML 页面 它只显示一个表单并要求用户填写 我想自动捕获Windows域用户名和机器名 并将其与表单中收集的数据一起提交 我可以在客户端这样做吗 HTML JavaScript 或者我被迫在服务器端执行此操作 我还不
  • 保证金如何运作?

    我在下面提供了marginfix这是一个块级元素并且one and two也是块级的 但它们是浮动的 这就是为什么它们位于同一行布局的原因 但是marginfix也不浮动 块级元素应位于该元素下方 如下所示
  • 替换img路径jquery

    我正在尝试替换 jquery 中的 img 路径 注入远程页面 replaceexample com thumbs withexample com images 我已经尝试过这个 但似乎不起作用 img attr src replace t
  • 为什么Promise中的代码会同步执行? [复制]

    这个问题在这里已经有答案了 在我的项目中 我有一个很长时间运行的操作 所以我决定将其放入Promise因为我认为这样我就可以在里面的代码继续执行其他操作Promise正在跑步 调试的时候发现外面的代码Promise仅当里面的代码执行Prom
  • 为某个时刻添加持续时间 (moment.js)

    时刻版本 2 0 0 阅读文档后 http momentjs com docs manipulating add 我认为这很简单 Chrome 控制台 var timestring1 2013 05 09T00 00 00Z var tim
  • 为什么这个递归函数返回未定义?

    我正在尝试编写一个使用递归组合两个字符串的函数 我的代码如下 但我不知道为什么该函数返回未定义 特别是当我在基本情况下使用 console log 时 它不会打印未定义而是打印正确的值 var str3 function merge str
  • 如何将React JS状态保存到本地存储中

    我不知道如何将 React js 状态存储到本地存储中 import React Component from react import App css import auth createUserProfileDocument from
  • 是否有跨浏览器的方式在Javascript中设置style.float?

    通常 如果您需要在 JavaScript 中设置样式属性 您可以这样说 element style attribute value 虽然略有不同 但属性名称通常与 HTML 属性名称类似 尽管是驼峰式 对我来说问题是 float 属性不起作
  • 当 Chrome 中嵌套滚动中的数据更改时防止页面滚动

    我在页面中有一个固定大小的元素 带有 溢出 滚动 其内容经常更改 我预计该元素内部发生的更改会影响该元素的滚动 但不会影响页面滚动 但是当这个元素位于页面顶部时 页面本身开始滚动 我怎样才能防止这种情况发生 要重现此行为 我在 chrome
  • chrome 选项卡/窗口中的 window.open 行为

    我有一小段 javascript 旨在打开两个或更多选项卡 这在 FF 和 IE 中工作正常 但 chrome 会在新窗口而不是选项卡中打开第二个窗口 它不依赖于 url 因为我已经尝试过使用两个相同的 url 第一个在选项卡中打开 第二个
  • 如何捕获文本区域上的 Enter 按键而不是 Shift+Enter? [复制]

    这个问题在这里已经有答案了 I m doing it for texarea A function should be called when the user press Enter but nothing should be done
  • jQuery:向左滑动和向右滑动

    我见过slideUp and slideDown在 jQuery 中 左右滑动的功能 方式怎么样 您可以使用 jQuery UI 中的附加效果来做到这一点 详情请参阅此处 http docs jquery com UI Effects Sl
  • 获取类中的所有静态 getter

    假设我有这个类 我像枚举一样使用它 class Color static get Red return 0 static get Black return 1 有没有类似的东西Object keys to get Red Black 我使用
  • jQuery UI 对话框 - 关闭后无法打开

    我有一个问题jquery ui dialog box https jqueryui com dialog 问题是 当我关闭对话框然后单击触发它的链接时 除非刷新页面 否则它不会再次弹出 如何在不刷新实际页面的情况下回调对话框 下面是我的代码
  • 如何得知客户端从服务器的下载速度?

    根据客户的下载速度 我想以低质量或高质量显示视频 任何 Javascript 或 C 解决方案都是可以接受的 Thanks 没有任何办法可以确定 您只能测量向客户端发送数据的速度 如果没有来自客户端的任何类型的输入来表明其获取信息的速度 您
  • 如何使用 Django (Python) 登录表单?

    我在 Django 中构建了一个登录表单 现在我遇到了路由问题 当我选择登录按钮时 表单不会发送正确的遮阳篷 我认为前端的表单无法从 查看 py 文件 所以它不会发送任何 awnser 并且登录过程无法工作 该表单是一个简单的静态 html
  • 使用严格模式编译指示时如何声明全局变量

    使用自调用函数来包装严格模式兼容代码 通常称为严格模式编译指示 被认为是一种很好的做法 function use strict Strict code here 我的问题是在这种情况下如何声明全局变量 我今天知道的三种替代方案 替代方案 1
  • Radiobutton-带有纯 html/css 的按钮

    是否可以创建像这样的单选按钮JQuery http jqueryui com demos button radio那些 用纯html css thanks 试试这个小提琴 http jsfiddle net mcXm7 1 http jsf
  • YouTube 点击时禁用 HTML5

    有没有办法让我们通过javascript禁用HTML5视频的 播放 暂停 点击全屏 功能 然后在我们再次需要时将其放回去 我不知道你是否可以禁用它们 但你可以使用 css 删除它们 video webkit media controls f
  • 拉斐尔路径交叉点不起作用

    我对拉斐尔和 pathIntersection method JSFiddle 示例 http jsfiddle net t6gWt 2 您可以看到有两条线都与曲线相交 但当我使用 pathIntersection method 有一个未解

随机推荐

  • 当客户向您提供他们的公共证书时进行相互身份验证

    通常 2 路 ssl 又名相互身份验证包括生成服务器 ca 密钥和证书等 然后客户端生成一辆车 将其交给您 您签署他们的 csr 并向他们提供客户端证书 然而 我遇到过一种情况 客户要求我通过交换彼此的 x509 公共证书来实现 相互身份验
  • 使用 Apache POI 创建 .xlsx 文件时出现 java.lang.NoClassDefFoundError

    我正在尝试使用 Apache POI 创建 xlsx 文件 这是我的代码 FileOutputStream outputStream1 null XSSFWorkbook workbook new XSSFWorkbook XSSFShee
  • Cython 预编译器决策[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我正在寻找一种在 cython 文件中添加预编译器逻辑的解决方案 我已经为 C 中的硬件设备 API 编写了一个 cython 包装器 这是一个 cython 项目 通常使用 MSVC
  • 如何根据点是否在多边形内来标记点

    我有新西兰各地鸟类观测的经度和纬度 存储在Count df 在变量下count longitude and latitude 然而 其中一些出现在近海 海洋中 这是一个公民科学数据集 我想根据这些点是否超出中给出的信息来对它们进行子集化ma
  • 在 WooCommerce 中阻止在没有送货方式的情况下访问结账

    我正在尝试删除继续结帐按钮并限制对结帐页面的访问 直到客户填写购物篮页面上的 计算运费 选项 我创建了一种仅限于多个邮政编码 邮政编码的本地运输方法 然后我将其添加到我的functions php 文件中 function disable
  • EF 的代理键与自然键

    我和我的同事正在尝试确定哪种方法是为两个数据库表设计架构和键的更好方法 一种是很少改变的查找表 它有大约 700 行 另一个表引用查找表 随着时间的推移 该表将有数千行 在设计 B 中 查找表的主键由 3 个 varchar 组成 另一个表
  • 将 VoiceOver 推进到移动 Safari 中的指定元素

    我无法弄清楚如何将 VoiceOver 推进到 Mobile Safari 中的特定元素 到目前为止 我已经尝试过 a href target Skip a a a 如果页面可滚动 但在长页面和短页面上不一致 这将 有时 前进到目标 有时会
  • 解析Excel文件的通用方法

    我需要解析 Excel 文件并从中创建对象列表 为了做同样的事情 我们正在使用有org apache poi为了读取 Excel 文件并且我们能够获取所需的详细信息 目前我们正在根据索引获取单元格值并将其设置到对象字段 但我们认为这不是一个
  • 在Python中按日期范围过滤日志的最佳方法

    打印与日期时间范围匹配的日志行的最佳方法是什么 例如 我只想打印带日期的行 来源 2012 09 30 00 00 10 至 2012 09 30 00 00 13 2012 09 30 00 00 08 773 log error 201
  • 计算平均值时如何避免潜在的溢出?

    我正在编写一个函数来获取调用特定的时钟的平均值void void aka void gt void运行特定次数 我担心如果样本量太大 观察值的总和会溢出并使平均值无效 是否有一种标准方法可以消除此类问题中总和溢出的可能性 注意 我知道这个例
  • 无法创建从插件到 Web 服务的 SSL/TLS 安全通道

    当我尝试使用服务引用中的方法时 我的插件出现问题 我有一个client将参数发送到网络服务 然后将这些参数发送到我的插件 然后我必须获取这些参数并将它们发送到网络服务用一个网络参考方法 要访问 Web 服务 我需要使用由拥有最后一个 Web
  • 从文件中读取数据并将其存储到向量中

    我正在尝试从文件中读取项目列表 然后将它们存储到向量中 问题是我的代码将最后一个项目添加到向量中两次 我不确定为什么它会继续读取文件 即使程序已到达末尾 这是文本文件中的内容 当我显示矢量的内容时 Oranges 行出现两次 苹果 磅 10
  • 将“xml”导入 Sql Server

    我有一个结构如下的文件
  • 将特定内容分支到一个文件中

    我试图拥有一个特定于每个分支的文件 我不希望在合并时覆盖或更新此文件 为什么这不起作用 我的尝试是基于如何防止跟踪的配置文件被 git 中的合并更改 但由于某种原因它不起作用 我也关注了更详细的博客文章这个答案是基于这个答案的 而且它的行为
  • 查找小数点后的位数[重复]

    这个问题在这里已经有答案了 我正在尝试编写Python 2 5 4代码来编写一个函数 该函数将浮点数x作为输入并返回x中小数点后的位数 这是我的代码 def number of digits post decimal x count 0 r
  • 文件 PixelFormat 中的 BitmapImage 始终为 bgr32

    我正在使用以下代码从文件加载图像 BitmapImage BitmapImg null BitmapImg new BitmapImage BitmapImg BeginInit BitmapImg UriSource new Uri im
  • 操作类不适用于 Selenium 3.5.3

    我想将元素从一个地方拖放到另一个地方 因此 我使用操作类来实现我的功能 问题是我的代码成功执行 没有显示任何错误 但功能目标没有实现 我在 Firefox 和 Chrome 浏览器中尝试了相同的代码 但在这两个浏览器中都重复了同样的问题 这
  • 使用交互触发器调用可见性更改方法 WPF

    我想弄清楚的是两件事 如何在用户控件的可见性更改时触发触发器以及将可见性值作为参数传递 无论出于何种原因 扳机似乎都没有触发 我刚刚添加了 ControlVisible 参数来显示我想要发生的情况 在测试时它不存在 只是在内部有一个消息框来
  • 在 Wow6432Node 中写入不重定向的注册表值

    此代码插入注册表值 Microsoft Win32 RegistryKey key key Microsoft Win32 Registry LocalMachine CreateSubKey SOFTWARE Microsoft Inte
  • 如何停止 requestAnimationFrame 递归/循环?

    我使用 Three js 和 WebGL 渲染器来制作一个游戏 当play链接被点击 对于动画 我使用requestAnimationFrame 我这样启动它 self animate function self camera lookAt