OffscreenCanvas 无法克隆,因为它已分离

2023-12-01

昨天又回到了我对 HTML canvas 的爱好,并尝试在单独的线程中进行渲染,只是在控制台中面临以下错误:

未捕获的 DOMException:无法在“Worker”上执行“postMessage”:无法克隆 OffscreenCanvas,因为它已分离。 在主要(http://localhost:8000/responsivetemplate/:47:14)

[索引.html]

<!DOCTYPE HTML>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta http-equiv="cache-control" content="max-age=0" />
<meta http-equiv="cache-control" content="no-cache" />
<meta http-equiv="cache-control" content="must-revalidate" />
<meta http-equiv="expires" content="0" />
<meta http-equiv="expires" content="Tue, 01 Jan 1980 1:00:00 GMT" />
<meta http-equiv="pragma" content="no-cache" />
<meta charset="UTF-8" />
<title>OffscreenCanvas</title>
</head>
<body>
  <div id='wrapper'>
    <div id='content'>
      <canvas id="testcanvas" width="512" height="512"></canvas>
    </div>
  </div>
</body>
<script>
'use strict';

document.body.onload = function () {
  var canvas = document.getElementById('testcanvas');
  canvas.imageSmoothingEnabled = false;

  const offscreenCanvas = canvas.transferControlToOffscreen();

  const worker = new Worker('render.js');

  var speed = 100;

  var currentTime = 0; var timeDiff = 0; var lastTime = 0;
  var timeProduct = 0; var dTime = 0; var timeScale = 1; var timeStep = 0.01;

  var posX = 10; var posY = 10;

  function main() {
    currentTime = performance.now();
    timeDiff = (Math.abs(currentTime - lastTime) * 0.001);
    dTime += Math.min(timeDiff, 1);
    timeProduct = timeStep * timeScale;

    while (dTime > timeProduct) {
      //draw();
      worker.postMessage({canvas: offscreenCanvas, posX: posX, posY: posY}, [offscreenCanvas]);
      dTime -= timeProduct;
    }

    lastTime = currentTime;

    posX += speed * timeDiff;
    posY += speed * timeDiff;

    if (posX > 500) posX = 10;
    if (posY > 500) posY = 10;

    requestAnimationFrame(main);
  }

  requestAnimationFrame(main);
};
</script>
</html>

[worker.js]

'use strict';

var canvas;
var ctx;

function draw(posX, posY) {
  //clear
  ctx.setTransform(1,0,0,1,0,0);
  ctx.clearRect(0, 0, canvas.width, canvas.height);
  ctx.fillStyle = "#000000";
  ctx.fillRect(0, 0, canvas.width, canvas.height);

  //draw
  ctx.beginPath();
  ctx.moveTo(posX, posY);
  ctx.ellipse(posX,
              posY,
              5,
              5,
              0.7854,
              0,
              2 * Math.PI,
              false);
  ctx.strokeStyle = "white";
  ctx.stroke();
}

onmessage = function(ev) {
  if(ev.data) {
    if (!canvas) canvas = ev.data.canvas;
    if (!ctx) ctx = canvas.getContext('2d');
    var posX = ev.data.posX; var posY = ev.data.posY;
    draw(posX, posY);
  }
}

我不知道是什么原因导致此错误 - 代码仅在主线程中运行时工作正常,也已经检查了一些站点,我确信控件已发送到屏幕外:\


您应该仅将 OffscreenCanvas 发送给工作人员一次:

worker.postMessage({canvas: offscreenCanvas}, [offscreenCanvas]);

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

OffscreenCanvas 无法克隆,因为它已分离 的相关文章

  • HTML/VBA Click 事件未触发

    这是我第一次在 StackOverflow 上发布问题 到目前为止 我已经能够通过 VBA 帮助论坛解决我的大部分问题 我的问题很简单 我有一个自动数据拉取 我需要在其中导出数据 我过去曾在这方面取得过成功 但这次略有不同 我尝试单击以生成
  • 消息“在 jest.setTimeout 指定的 5000 毫秒超时内未调用异步回调”

    我正在使用 Puppeteer 和 Jest 来运行一些前端测试 我的测试如下 describe Profile Tab Exists and Clickable settings user gt test Assert that you
  • 使用 moment.js 检查输入日期是否为星期一

    好吧 我想检查日期是否是星期一 例如 var myDate new Date moment myDate DD MM YYYY dayIs monday 在我的国家 一周的第一天是星期一 所以 我真的想检查输入日期是否是一周的开始 我尝试使
  • jQuery 选择 # id 以单词为前缀,计数器为后缀

    有没有办法用 jQuery 选择所有带有前缀 my 和后缀 0 9 的 id 像这样的 my 1 4 还是可以用循环来实现 div div div div div div div div div div 第一个想法 似乎效果很好 div i
  • Leaflet js虚构地图

    我是 Leaflet 的新手 我想了解如何创建完全交互式的虚构地图 我有一张图像想要转换为传单地图 该图像基本上像图表一样具有许多连接和点 我想首先将该图像转换为地图 能够将鼠标悬停在这些点上 突出显示它们并显示有关它们的信息 并且还可以在
  • 仅一页 JavaScript 应用程序

    您是否尝试过单页 Web 应用程序 即浏览器仅从服务器 获取 一页 其余部分由客户端 JavaScript 代码处理 此类 应用程序页面 的一个很好的例子是 Gmail 对于更简单的应用程序 例如博客和 CMS 使用这种方法有哪些优点和缺点
  • 如果链接包含特定文本,jQuery 将类添加到 href

    我的网站上的列表中有一些动态填充的链接 这些链接链接到文件 是否可以使用 jQuery 查看文件名是否以 pdf 结尾 并在 href 或类似的链接文本以 mp3 结尾时添加一个类 例如 我的列表中有以下链接 文件1 pdf 歌曲1 mp3
  • Javascript - 将值从下拉框传递到 Google Maps API

    我正在使用 Google 地图 API 为一家出租车公司创建报价表 目前 用户在 2 个文本框中输入出发点和接载点 API 会计算两点之间的距离以及行程费用 我正在尝试添加两个具有设定位置的下拉框 以便用户可以选择这些位置之一或使用文本框输
  • Google Chrome 106 可拖动导致元素消失

    使用拖放元素时 绝对定位元素中包含的大多数其他元素都会从屏幕上消失 如果我调整窗口大小 这些元素会出现 但在开始拖动时会再次消失 我在最新版本的 Google Chrome 106 和 Beta 版本 107 0 5304 18 以及现在的
  • IE11不监听MSFullscreenChange事件

    我正在尝试使用 Bigscreen js 在 IE11 中使用全屏 但 IE11 不监听 MS FullscreenChange 事件 document addEventListener MSFullscreenChange functio
  • Twitter 嵌入时间轴小部件

    我继续下载http platform twitter com widgets js http platform twitter com widgets js And the http platform twitter com embed t
  • 类型“typeof import("/home/kartik/Desktop/Ecommerce/ecommerce/node_modules/firebase/index")”上不存在属性“auth”。 TS(2339)

    我是 FireBase 的初学者 我正在尝试使用 Angular 通过 FireBase 实现 Google 登录 我在 auth 时收到上述错误 我特此附上login component ts和package json package l
  • 如何在jquery中获取保存时间和当前时间的差异?

    我想在 javascript 或 jquery 中获取保存时间和当前时间之间的时差 我节省的时间看起来像Sun Oct 24 15 55 56 GMT 05 30 2010 java中的日期格式代码如下 String newDate 201
  • 如果数字小于 10,则显示前导零 [重复]

    这个问题在这里已经有答案了 可能的重复 JavaScript 相当于 printf string format https stackoverflow com questions 610406 javascript equivalent t
  • 无法在前端使用 JavaScript Fetch API 将文件上传到 FastAPI 后端

    我正在尝试弄清楚如何将图像发送到我的 API 并验证生成的token那是在header的请求 到目前为止 这就是我所处的位置 app post endreProfilbilde async def endreProfilbilde requ
  • 如何在 javascript 正则表达式中匹配平衡分隔符?

    我原以为这个问题是不可能的 据我所知 Javascript 的正则表达式既没有递归插值 也没有漂亮的 NET 平衡组功能 但问题就在那里 如问题 12 所示正则表达式 alf nu http regex alf nu 匹配平衡对 lt an
  • 需要有关 React Js 的帮助

    我是 React Js 新手 我的代码无法正常工作 请看下面 这是我的脚本文件Main jsx 该文件由 React 编译 输出放置在 dist 文件夹下的 main js 文件中 var react require react react
  • 防止文本区域出现新行

    我正在开发聊天功能 使用 Vue 并使用文本区域作为输入 以便溢出换行 并且对于编写较长消息的用户来说更具可读性 不幸的是 当用户按下 Enter 键并提交时 光标会在提交之前移动到新行 从而使用户体验感觉不佳 关于如何使用普通 Javas
  • 使用异步调用时如何从 javascript 更新元刷新?

    我有一个系统 它使用元刷新来注销页面 该系统会在空闲用户后进行清理 不用担心 服务器也会导致会话超时 我开始通过 ajax 进行一些操作 不是真正的 xml 但这不是重点 我可以运行从异步请求返回的javascript 所以我想知道是否可以
  • KeyboardAvoidingView - 隐藏键盘时重置高度

    我正在使用 React NativeKeyboardAvoidingView设置我的高度View当显示键盘时 但是当我关闭应用程序中的键盘时 视图的高度不会变回原来的值

随机推荐

  • 这是我的网络应用程序的“记住我”功能的合法实现吗?

    我正在尝试向我的网络应用程序添加 记住我 功能 以使用户在浏览器重新启动之间保持登录状态 我想我已经得到了大部分 我使用谷歌应用程序引擎作为后端 它允许我使用java servlet 这是一些演示的伪代码 public class MySe
  • Docker 网络 Nginx 解析器

    我正在尝试删除配置中已弃用的 Docker 链接 剩下的就是摆脱那些Bad Gateway当我重新创建容器时 nginx 反向代理错误 注意 我在桥接模式下使用 Docker 网络 docker network create nettest
  • 从 sqlite 存储和检索 Uri

    我是一名新手开发人员 目前正在开发一个应用程序 其中部分功能允许用户捕获图像 将其存储在应用程序的文件系统中 并将其引用存储在 SQLite 数据库的列中 然后 用户将能够根据与数据库中关联的任何标准在网格视图中查看这些图像 例如 仅显示特
  • 如何使用 python 3.8.1 将 django 应用程序部署到heroku?

    我正在尝试将 django 应用程序部署到 heroku 安装 django heroku 时出现错误 越来越失败了错误是 从源代码构建 psycopg2 需要 pg config 我也尝试安装psycopg2 它也失败了 我使用的是 Ma
  • 触发电子邮件验证

    我正在使用自定义策略 期望的用户旅程是 用户在屏幕 1 上输入电子邮件 密码 成功验证屏幕 1 后 用户将转到屏幕 2 在屏幕 2 中 用户必须输入发送到其电子邮件的代码 请注意 用户在注册时已经验证了电子邮件 我被困在让 2 人去工作 目
  • PayPal 免费试用期的实施不会返回任何自定义参数

    最近两天一直被这个问题困扰 Scenario 我们有一个基于网络的产品 用户可以免费注册 14 天 之后每月订阅 60 美元 一旦用户点击 使用 Paypal 付款 按钮 页面将把用户带到 Paypal 一旦他们完成付款 它就会重定向回我们
  • 如何在不禁用firewalld(Kubernetes)的情况下使用Flannel

    我是法兰绒和 K8s 的新手 我正在我的 1 个主节点和 2 个节点集群 由 KVM 创建 上使用它们 我使用 flannel 网络插件初始化了集群 然后我发现我无法访问内部 结果发现可能是我的网络或者DNS进程出了问题 下列的https
  • 具有继承列表的自动映射器

    仅供参考 这与这个问题不同自动映射器以及从集合或列表继承 这是我继承的列表 public class MyPagedList
  • 在模拟器中使用 Google 登录按钮时出现问题

    当我单击 Google 登录按钮时 它会显示以下对话框 我单击 更新 但没有任何反应 但我的 logcat 给出了以下输出 01 24 07 38 48 121 W GooglePlayServicesUtil 1305 Google Pl
  • 日期时间差异

    我有2个变量 GMDCOMTM which stores the date time Tue Oct 1 13 32 40 2013 GMDRRSTM which stores the date time Tue Oct 2 23 35 3
  • 值参数的常量正确性

    我知道关于 const 正确性的问题很少 其中指出函数的声明及其定义不需要就值参数达成一致 这是因为值参数的常量仅在函数内部重要 这可以 header int func int i cpp int func const int i retu
  • [Passportjs][Angular5] 请求的资源上不存在“Access-Control-Allow-Origin”标头。因此不允许访问原点“null”

    我正在尝试将 Nodejs 后端 api 与 Angular 集成 我在后端应用程序上实施了 passpor google passport github passport twitter 策略 我的后端应用程序网址是http localh
  • 成形的 iframe 可能吗?

    是否可以使用六边形 菱形或长方形或正方形以外的任何形状的 iframe 或者甚至可能是一个 div 你可以用 CSS mask 来伪造它 但它的一部分会被它遮盖 你不能使iframe将其内容呈现在这些形状之一内
  • 如何在 shell 脚本中对整数比较进行逻辑或运算?

    我正在尝试进行简单的条件检查 但似乎不起作用 If 等于0或大于1然后打个招呼 我尝试过以下语法但没有成功 if 0 o gt 1 then echo hello fi if 0 gt 1 then echo hello fi 这应该有效
  • Stream 的复用是否是流的副本

    例如 有一个带密钥的流 val keyedStream KeyedStream event Key env addSource keyBy several transformations on the same stream keyedSt
  • 无法理解输出的原因

    我正在运行一个代码片段 但我无法理解代码及其产生的输出 include
  • 使用 HTTPS 的 HttpGet:SSLPeerUnverifiedException

    Using Http客户端 当我尝试通过 HTTPS 进行通信时收到以下错误 线程 main 中出现异常 javax net ssl SSLPeerUnverifiedException 对等点未经过身份验证 这是我的代码 URI logi
  • javafx,如何实现confirmHandler?

    我正在使用 javafx 的网络引擎来显示网页 在页面上 有一个脚本调用window confirm 我已经知道如何设置确认处理程序以及如何显示类似模式的对话框 我的问题是如何在处理程序返回之前获得用户的选择 webEngine setCo
  • JSF 2:ajax 调用后页面重定向

    我陷入了类似的导航案例问题this一 简而言之 我正在尝试使用 ajax 渲染将导航从一个页面重定向到另一个页面h commandLink 这是支持 bean ManagedBean public class StartBean publi
  • OffscreenCanvas 无法克隆,因为它已分离

    昨天又回到了我对 HTML canvas 的爱好 并尝试在单独的线程中进行渲染 只是在控制台中面临以下错误 未捕获的 DOMException 无法在 Worker 上执行 postMessage 无法克隆 OffscreenCanvas