Unity场景运行时能否创建新的HoloLens 2沉浸式视图
结论
你的判断完全正确。
HoloLens 2 系统全局仅维护一个活跃的沉浸式视图(独占全息渲染会话),Unity 编译生成的UWP应用启动后会第一时间抢占该唯一会话的所有权。你在Unity运行过程中从原生C++插件侧尝试初始化新的沉浸式视图时,系统会直接阻塞初始化流程、拒绝分配对应的渲染和线程资源,这就是你始终拿不到初始化执行结果的根本原因,和线程申请逻辑本身无关。
可落地的解决路径
- 全量替换Unity渲染场景:先主动释放Unity持有的沉浸式会话所有权,再执行原生视图初始化。先在C#层调用
UnityEngine.XR.Management.XRGeneralSettings.Instance.Manager.StopXRShutdown()完全关闭Unity XR管线,等待200ms左右待系统回收完会话资源后,再通过封装层调用原生侧的immersiveView.init()即可正常完成初始化。后续需要切回Unity内容时,重新调用XR管理类的初始化启动接口即可。 - 在Unity场景内叠加原生渲染内容:不需要创建独立沉浸式视图。通过Unity原生插件的导出接口,直接从Unity运行时拿到当前正在使用的
HolographicSpace实例、D3D设备指针,把你的原生渲染逻辑注册到Unity的渲染回调事件中,在Unity的渲染线程上提交自定义图元即可,这种方式不会和Unity争抢会话所有权,性能和稳定性都最优。 - 独立功能模块跳转:如果你的自定义沉浸式视图是完全独立的功能,不要放在Unity主进程内初始化。将原生沉浸式视图逻辑打包为独立UWP应用,通过UWP协议激活的方式从Unity应用跳转至该应用,功能结束后再协议跳回Unity,由系统负责两个应用间的沉浸式会话切换,完全规避同进程的资源冲突。
排查验证技巧:在原生
immersiveView.init()的调用位置加错误码捕获,当系统存在活跃沉浸式视图时,接口会返回ERROR_ACCESS_DENIED,可以直接确认是会话占用导致的初始化失败。
内容的提问来源于stack exchange,提问作者Ali Can KESKİN
相关产品推荐
相关产品推荐

