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