覆盖非活动选项卡的 setTimeout 行为

2023-12-02

我目前正在使用 WebRTC 在 JavaScript 中开发一个点对点游戏。它将其中一个对等点(即主机)视为服务器,而任何其他加入的对等点则通过 Node.js 代理服务器连接到主机。

我目前正在尝试解决以下问题:如果主机切换选项卡以使游戏不再是活动选项卡,则游戏会停止为所有人更新。经过一些研究后,我发现这是因为我正在使用类似的东西:

setTimeout(callback, 1000 / 60);

在我的游戏循环中。 setTimeout(至少在我关心的浏览器 Chrome 和 Firefox 中)的定义是,如果调用它的页面不在您的活动选项卡中,则每秒最多可以调用一次。

我读到 Web Workers 没有这个限制,但为了实现这一点,我需要在 Web Workers 中运行所有游戏逻辑。我尝试使用 JSON.stringify() 将游戏对象发送给工作人员,但它说该对象有循环引用(在游戏循环中),并且无法转换为 JSON。所以我不知道该怎么办。

我还考虑实现自己的计时器,无论页面是否位于活动选项卡中,该计时器都会继续运行,但我也不知道如何执行此操作。

只要不会产生很大的性能开销,我用这些方法,甚至是我还没有想到的其他方法都没有问题。任何建议将不胜感激。


因此,正如我上面所说,Web Workers 能够调用 setTimeout(),对于非活动选项卡不会有 1 秒的延迟。我的解决方案是创建一个 Web Worker,它只负责调用 setTimeout() (在其 onmessage 事件侦听器中调用)。然后,在每个游戏循环结束时我调用:

this.worker.postMessage(null)

可能有人会说,赋予 Web Worker 更多责任比仅仅调用 setTimeout() 更有效,因为我已经添加了等待主线程和工作线程之间发送消息的开销。这是我将来可能会考虑的事情。

这样做的主要问题是与 IE 的兼容性; IE 直到 10.0 版本才获得对 Web Worker 的支持。这对我来说并不是真正关心的问题,但我认为值得一提。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

覆盖非活动选项卡的 setTimeout 行为 的相关文章

随机推荐

  • 执行具有多个结果集的存储过程

    我正在使用 SSIS 2016 存储过程返回 4 个结果集 只有第一个结果集是相关的 需要写入表中 我无法修改存储过程 我不关心其他结果集中返回的任何数据 存储过程位于 SQL Server 2016 数据库中 结果也将驻留在 SQL Se
  • 是否可以在 Shiny 的条件面板中使用 uiOutput?

    我有一个非常基本的 Shiny 应用程序 我在用renderUI and uiOutput填充一个selectInput可以选择日期 但我只想这样selectInput当用户通过单选按钮选择一个选项时出现 就目前而言 应用程序单选按钮没有任
  • 在 ie10 中强制浏览器和文档模式为 ie9

    这段代码 似乎只将文档更改为ie9而不是浏览器 除了按 F12 并手动更改之外 还有其他想法吗 站点无法设置浏览器模式 在浏览器从站点请求内容之前选择浏览器模式 这指定了站点如何识别浏览器 例如 UA 字符串 正如您所提到的 文档模式可以由
  • DataSet TableAdapter 抛出 OVER SQL 构造或不支持的语句

    我有一个 t sql 查询写成这个示例帮助 SELECT t gName AS Product isnull SUM CASE WHEN t Col 1 THEN t Quantity END 0 AS 180ml isnull SUM C
  • 除了使用自适应卡之外,还有其他方法可以启用日历选项作为 V4 聊天机器人 C# 中的输入吗?

    有没有办法在聊天机器人中启用日期和时间输入 即日历选项 而不使用自适应卡 正如我从下面的链接中了解到的 除 Microsoft 渠道外 所有渠道均不支持自适应卡 如何使用 C 添加通过卡片内的提示选项显示的自定义选项以及在 BOT V4 中
  • Beautifulsoup 丢失节点

    我正在使用 Python 和 Beautifulsoup 来解析 HTML 数据并从 RSS 源中获取 p 标签 但是 某些 url 会导致问题 因为解析的 soup object 不包括文档的所有节点 例如我尝试解析http feeds
  • 如何更改实体框架生成日期时间 SQL 精度的方式

    我有一个表使用 id 和 DateTime 列作为 pk 但是当我尝试通过实体框架更新数据时 如下所示 using Entities context new Entities var item from item in context Ba
  • Objective C 类的默认基类

    这个问题的答案可能是显而易见的 但我需要确定 当类定义中没有显式定义基类时 所有目标 c 类是否共享一个公共的默认基类 不 如果您没有在类定义中显式定义超类 那么您将创建一个根类 From 可可核心竞争力 根类不继承自其他类 并定义其下层次
  • 如何修复使用 Graphicsmagick 收集的损坏的 alpha 通道(残留像素)的 .gif?

    我想将带有 Alpha 通道的 avi 转换为 gif 首先 我使用 ffmpeg i source avi vf scale 720 1 flags lanczos fps 10 frames ffout 03d png 将 avi 转换
  • 如何“解码”字体文件的eexec?

    我有一个 pfa 字体文件我想阅读渲染字体的 算法 然而 大部分信息都隐藏在二进制行中 currentfile eexec 743F8413F3636CA85A9FFEFB50B4BB27302A5F6C876586CCC1670A7EF5
  • 如何在 PHP 中请求 facebook 权限?

    如何在 PHP 中请求 facebook 权限 你能给我举个例子吗 thanks 假设你有用户的access token 你可以通过 facebook gt getAccessToken 用户登录后 try permissions face
  • 推送消息不使用分布式证书发送

    我可以使用沙箱使用开发人员 p12 文件发送推送通知 但我在应用程序商店上的应用程序 我使用与 gateway push apple com 消息一起使用的分发证书 f12 文件无法到达设备 在分布式证书上激活推送通知服务 我检查了deve
  • 基于位置追踪的iOS全时后台服务

    我目前正在编写一个应用程序 该应用程序依赖于位置跟踪并将有关位置的数据发送到服务器 然而 问题是它必须 24 7 运行 目前我遇到每 2 3 天发生一次的随机崩溃 为了使应用程序在后台持续运行 我所做的是将 NSTimer 放入 appli
  • 如何从标记存储在变量中的树中选择节点?

    考虑以下 XSLT 脚本
  • Windows 中 Git 克隆权限失败

    当我在 Windows 10 v 1909 上使用 CMD 或带有 ssh agent 的 PowerShell 从 GitHub 克隆时 显示以下内容 email protected Permission denied publickey
  • 如何动态改变网页的标题?

    我有一个网页 它实现了一组选项卡 每个选项卡显示不同的内容 单击选项卡不会刷新页面 而是在客户端隐藏 取消隐藏内容 现在需要根据页面上选择的选项卡更改页面标题 出于 SEO 原因 这可能吗 有人可以建议一个解决方案 通过 javascrip
  • 通过多索引的子集从 pandas 中选择行

    我在 pandas 中有一个多索引数据框 索引中有 4 列 还有一些数据列 示例如下 import pandas as pd import numpy as np cnames K1 K2 K3 K4 D1 D2 rdata pd Data
  • HTML - 阿拉伯语支持

    我有一个网站 我必须在其中添加一些阿拉伯语行 如何做到这一点 在哪里获取阿拉伯文本字符 如何使页面支持阿拉伯语 我必须每页放一行 而且有很多页面 所以不能四处制作图像并放置它们 这是所需的答案 但每个人都只回答了其中的一部分 Step 1
  • MySQL 从一个表中选择不在另一个表中的特定条目

    当尝试从表中选择不在另一个表中的特定条目时 我在 MySQL 中遇到问题 我知道这句话听起来很疯狂 但这是我想做的一个例子 表用户 user id username password plus other columns not impor
  • 覆盖非活动选项卡的 setTimeout 行为

    我目前正在使用 WebRTC 在 JavaScript 中开发一个点对点游戏 它将其中一个对等点 即主机 视为服务器 而任何其他加入的对等点则通过 Node js 代理服务器连接到主机 我目前正在尝试解决以下问题 如果主机切换选项卡以使游戏