WebXR 应用生命周期

在本指南中,我们将从全局的角度了解创建和驱动 WebXR 应用程序所涉及的内容,而不会深入到代码级别进行详细介绍。 这将为本 WebXR 指南中接下来的几篇文章做好准备,这些文章涵盖了启动和关闭 WebXR 会话、几何体模拟相机空间跟踪等。

生命周期概述

大多数使用 WebXR 的应用程序都遵循类似的整体设计模式

  1. 检查用户的设备和浏览器是否都能够呈现您想要提供的 XR 体验。
    1. 确保 WebXR API 可用;如果navigator.xr未定义,则可以假设用户的浏览器和/或设备不支持 WebXR。 如果不受支持,请禁用用于激活 XR 功能的任何用户界面,并中止任何尝试进入 XR 模式。
    2. 调用navigator.xr.isSessionSupported(),指定您想要提供的 WebXR 体验模式:inlineimmersive-vrimmersive-ar,以确定您希望提供的会话类型是否可用。
    3. 如果要使用的会话类型可用,请为用户提供相应的界面,以便他们可以激活它。
  2. 当用户通过与上面启用的用户界面交互来请求激活 WebXR 功能时,使用所需的模式请求一个XRSession。 这是通过调用navigator.xr.requestSession()完成的,再次指定指示要启用的模式的字符串:inlineimmersive-vrimmersive-ar
  3. 如果 requestSession() 返回的 Promise 解析成功,请使用新的XRSession 在 WebXR 体验持续期间管理 WebXR 会话。 这将涉及管理输入、动画和渲染。
    1. 调用XRSession 方法requestAnimationFrame() 为 XR 设备安排第一帧渲染。
    2. 如果您的场景很复杂,您应该考虑创建一个Worker(或使用您之前为此目的创建的 Worker)来执行渲染每一帧所需的计算。 这将减少渲染过程明显停顿应用程序的可能性。
    3. 每个 requestAnimationFrame() 回调都应该使用关于 3D 世界中对象的信息,使用 WebGL 渲染帧。
    4. 每次调用回调时,都应该再次调用requestAnimationFrame(),以便让浏览器知道在渲染下一帧的时候需要再次运行该回调。
  4. 当时间到来时(例如,当用户退出您的应用程序或从您的站点导航离开时),结束 XR 会话;否则,继续循环,直到用户选择退出 XR 模式。
    1. 要自己结束 XR 会话,请调用XRSession.end()
    2. 包含XRSession 事件end 的处理程序,以便在会话结束时获得通知,无论您的代码、用户还是浏览器是否启动了会话的终止。