热插拔 3d 框架

如何解决热插拔 3d 框架

我正在处理的 AR 项目要求我在 .hcap 体积视频场景和交互式游戏场景之间来回转换几次。我在 .hcap 场景中使用 8th wall /three.js (HolovideoObject),并且想在游戏场景中使用 Playcanvas。我需要在同一网页上交换场景的原因是客户端不希望用户多次请求相机权限。在将 html/js 注入 body 来交换场景之前,我先调用这个清理函数

const cleanUpScene = (scene) => {
  switch(scene) {
    case SceneType.HCAP:
      XR8.stop()
      const {scene,camera,renderer} = XR8.Threejs.xrScene()
      renderer.xr.dispose()
      renderer.dispose()
      XR8.clearCameraPipelineModules()

      $('#cameraFeed').remove()
      break

    case SceneType.Game:
      XR8.PlayCanvas.stopXr()
      pc.app.destroy()
      XR8.clearCameraPipelineModules()

      $('#application-canvas').remove()
      $('#cameraFeed').remove()
      break

    default:
      break;
  }
}

我能够成功交换场景,但在多次交换后我收到以下错误消息:

> There are too many active WebGL contexts on this page,the oldest context will be lost.
...
> TypeError: null is not an object (evaluating 'A.TEXTURE_2D')

第二个错误发生在第一个错误发生几次之后。我看过一些帖子推荐在 WebglrenderingContext 上调用 lossContext()。我试过添加

const cleanUpScene = (scene) => {
  switch(scene) {
    case SceneType.HCAP:
      ...
      renderer.xr.dispose()
      renderer.getContext().getExtension('WEBGL_lose_context').loseContext()
      renderer.dispose()
      ...
      break

    case SceneType.Game:
      ...
      XR8.PlayCanvas.stopXr()
      pc.app.graphicsDevice.gl.getExtension('WEBGL_lose_context').loseContext()
      pc.app.destroy()
      ...
      break

    default:
      break;
  }
}

经过几次交换后,添加它会导致在上面列出的 2 个之间出现新的错误消息:

> WebGL: INVALID_OPERATION: loseContext: context already lost

我的猜测是,即使画布元素已被销毁,某些东西仍然保留对 WebglrenderingContext 的引用。

有没有人对正在发生的事情以及如何解决这个问题有任何想法?感谢您阅读所有内容,并提前感谢您提出任何建议。

解决方法

不幸的是,唯一适用于我的用例的解决方案是完全破坏 web gl 上下文和关联的 3d 框架的应用程序实例。上面的“上下文已经丢失”错误已在 8th wall 的版本 v16.1.4.1227 中修复。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?