0

我正在处理的 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 上调用 lostContext() 的帖子。我试过添加:

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 的引用。

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

4

1 回答 1

1

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

于 2021-06-13T19:06:06.247 回答