使用电脑资源通过全息远程处理远程应用来为应用提供支持
本文介绍全息远程处理的以下用例:
- 希望使用电脑资源来为应用提供支持,而不是依赖于 HoloLens 板载资源:可以创建和构建具有全息远程处理功能的应用。 用户在 HoloLens 上体验应用,但应用实际是在电脑上运行,从而使应用可以利用电脑更强大的资源。 如果应用具有高分辨率资产或模型,并且你不希望帧速率受到影响,则这种做法非常有效。 我们称之为“全息远程处理远程应用”。 将来自 HoloLens 的输入(凝视、手势、语音和空间映射)发送到电脑,在其中内容以虚拟沉浸式视图呈现。 然后,将渲染的帧发送到 HoloLens。
此类型的全息远程处理也可用于 Windows Mixed Reality (WMR) 沉浸式头戴显示设备。 例如,如果 WMR 头戴显示设备连接到某个背包电脑,并且你希望将应用从功能更强大的电脑流式传输到该背包电脑,这可能会很有用。
若要了解有关全息远程处理的详细信息,请参阅全息远程处理概述
请注意,如果希望在开发过程中预览和调试应用,则也可以使用全息远程处理。
全息远程处理中的两种可用模式
模式 1:远程应用在个人电脑上以连接模式运行,播放器在 HoloLens 2 上以侦听模式运行。
当远程应用尝试连接时,播放器将侦听传入连接。
模式 2:远程应用在个人电脑上以侦听模式运行,播放器在 HoloLens 2 上以连接模式运行。
当播放器尝试连接时,远程应用将侦听传入连接。
设置全息远程处理播放器应用
要单独在模式 1 下使用全息远程处理,需要在 HoloLens 2 上从 Microsoft Store 安装全息远程处理播放器应用(在本文中,我们将其简称为“播放器”)。 如下所述,下载并运行该应用后,将会显示要连接的版本号和 IP 地址。 我们建议使用可用的最新版本的播放器。
全息远程处理需要运行快的电脑和高速 Wi-Fi 连接。 可以在上文链接的播放器文章中找到更多详细信息。
若要在上面指定的两种模式下使用全息远程处理,需要克隆全息远程处理示例播放器,并使用 Visual Studio 将其部署到 HoloLens 2。
使用 Unity 构建在电脑上运行的远程应用以进行全息远程处理
在菜单栏上,选择“编辑”>“项目设置…”。
在左侧列中,选择“XR 插件管理”。
确保你位于“通用 Windows 平台设置”选项卡中。
在 OpenXR 插件部分中,选择“Microsoft HoloLens 功能组”和“全息远程处理远程应用功能组”。
取消选中“在启动时初始化 XR”复选框。
编写一些代码来设置远程处理配置并触发 XR 初始化。 应用可以调用模式 1 的连接函数,或调用模式 2 的侦听函数。 若要查看示例,请下载 Open XR Unity 混合现实示例,然后在 RemotingSample 项目中查看 AppRemoting.cs 脚本。
对于模式 1,即连接模式,请使用已填充的
RemotingConfiguration
调用Microsoft.MixedReality.OpenXR.Remoting.AppRemoting.Connect
。 示例应用在检查器中公开此内容,并展示如何从文本字段填充 IP 地址。 调用Connect
会设置该配置并自动初始化 XR,这就是必须将其作为协同例程调用的原因:StartCoroutine(Remoting.AppRemoting.Connect(remotingConfiguration));
对于模式 2,即侦听模式,请使用已填充的
RemotingListenConfiguration
调用Microsoft.MixedReality.OpenXR.Remoting.AppRemoting.Listen
。 示例应用在检查器中公开此内容。 调用Listen
会设置该配置并等待来自全息远程处理示例播放器的连接,这就是必须将其作为协同例程调用的原因:StartCoroutine(Remoting.AppRemoting.Listen(remotingListenConfiguration));
在运行时,可以使用
AppRemoting.TryGetConnectionState
API 获取当前连接状态,并可选择使用AppRemoting.Disconnect()
断开与 XR 的连接和取消初始化 XR。 这可用于断开连接,然后重新连接到同一应用会话中的其他设备。 RemotingSample 应用提供了一个可点击的立方体,如果点击它,则将断开与远程处理会话的连接。
在上述模式下运行全息远程处理远程应用和播放器应用
模式 1:在个人电脑上以连接模式运行全息远程处理远程应用,以侦听模式运行播放器:
如果已在 HoloLens 2 上从应用商店安装了播放器,请跳过下面用于构建和运行示例播放器应用的步骤 2 和步骤 3。 然后,运行已安装的播放器并继续执行步骤 4。
使用 VS 2019 打开全息远程处理示例播放器应用,然后执行下列操作之一:
使用 USB 电缆在 HoloLens 2 上运行:
- 配置构建选项,如下所示:
- 打开项目的“属性”页,然后导航到“配置属性”>“调试”。
- 单击“要启动的调试程序”下拉菜单,然后选择“设备”。
- 在“命令行参数”字段中,添加“-listen”。
使用 Wifi 在 HoloLens 2 上运行:
- 配置构建选项,如下所示:
- 打开项目的“属性”页,然后导航到“配置属性”>“调试”。
- 单击“要启动的调试程序”下拉菜单,然后选择“远程计算机”。
- 在“命令行参数”字段中,添加 HoloLens 的 Wifi IP 地址。
若要将 SamplePlayer 解决方案部署到 HoloLens 2,请按 Visual Studio 中的播放按钮。 你将能够看到在 HoloLens 2 上运行的 HAR 示例播放器,显示它“正在等待 HoloLens 2 的 IP 地址上的连接。”
在主机电脑上运行的远程应用中,添加上面显示的 HoloLens 2 的 IP 地址,然后选择“连接”。
建立连接后,在 HoloLens 2 上运行的播放器将开始“接收”。
模式 2:在聆听模式下在电脑上运行远程应用,在连接模式下运行 HAR 播放器应用:
在电脑上运行的远程应用的 2D UI 屏幕上,单击“侦听”。
打开项目的“属性”页,然后导航到“配置属性”>“调试”。
单击“要启动的调试程序”下拉菜单,然后选择“设备”。
在“命令行参数”字段中,添加主机电脑的 Wifi IP 地址。
若要将 SamplePlayer 解决方案部署到 HoloLens 2,请在 Visual Studio 解决方案中单击播放按钮。 你将能够看到在 HoloLens 2 上运行的 HAR 示例播放器,显示它“正在连接到命令行参数中给出的 IP 地址。”
建立连接后,在 HoloLens 2 上运行的全息远程处理示例播放器应用将开始“接收”。
提示
为了获得最佳效果,请确保应用正确设置了对焦点。 这有助于通过全息远程处理功能让场景最大程度适应无线连接的延迟。
从以前的全息远程处理 API 迁移
若要了解有关全息远程处理的详细信息,请参阅全息远程处理概述
UnityEngine.XR.WSA.HolographicRemoting
来自 Unity 文档中的示例代码:
XR.WSA.HolographicRemoting | OpenXR.Remoting.AppRemoting |
---|---|
HolographicRemoting.ConnectRemotingSession() |
AppRemoting.Connect(RemotingConfiguration) |
HolographicRemoting.DisconnectRemotingSession() |
AppRemoting.Disconnect() |
HolographicRemoting.ConnectionState |
AppRemoting.TryGetConnectionState(out ConnectionState, out DisconnectReason) |
UnityEngine.XR.WindowsMR.WindowsMRRemoting
XR.WindowsMR.WindowsMRRemoting | OpenXR.Remoting.AppRemoting |
---|---|
WindowsMRRemoting.Connect() |
AppRemoting.Connect(RemotingConfiguration) |
WindowsMRRemoting.Listen() |
AppRemoting.Listen(RemotingListenConfiguration) |
WindowsMRRemoting.Disconnect() |
AppRemoting.Disconnect() |
WindowsMRRemoting.TryGetConnectionState(out ConnectionState) 和 WindowsMRRemoting.TryGetConnectionFailureReason(out ConnectionFailureReason) |
AppRemoting.TryGetConnectionState(out ConnectionState, out DisconnectReason) |
WindowsMRRemoting.isAudioEnabled 、WindowsMRRemoting.maxBitRateKbps 、WindowsMRRemoting.remoteMachineName |
通过 RemotingConfiguration 结构传入 AppRemoting.Connect |
WindowsMRRemoting.isConnected |
AppRemoting.TryGetConnectionState(out ConnectionState state, out _) && state == ConnectionState.Connected |