本文来自群内反馈较为集中的一种故障
使用 PDC(PICO Developer Center)进行串流测试,是测试 PICO 项目的一种快捷手段。但是用过几次的开发者都知道,PICO 目前的方案依然不太稳定,时常会遇到各种意想不到的问题。其中一种高频报错会导致串流测试无法正常进行:测试时,Console 窗口会连续输出 IndexOutOfRangeException:renderPassIndex 报错,其堆栈指向 UnityEngine.XR.XRDisplaySubsystem:GetRenderPass,其症状如下图所示:

此时不妨试试以下两种解决方法:
方法一:测试之前确保不选中任何游戏对象(尤其是 Camera)
以下是易报错情况------测试前选中了某个游戏对象,尤其是包含了 Camera 的游戏对象。

以下是不易报错情况:测试前点击 Hierarchy 窗口空白处,确保没有选中任何游戏对象,然后再进行串流测试,此时报错大概率会消失并能正常进行串流测试。

如果执行以上操作后仍然报错,可尝试第二种方法。
方法二:确保 Scene 窗口和 Game 窗口不同时出现
如果窗口布局如下图所示,Scene 和 Game 窗口同时呈现在 Unity 编辑器中,也可能引发此类报错。

此时可尝试调整界面布局,确保 Scene 和 Game 窗口不同时呈现在编辑器中,如下图所示,将 Scene 和Game 窗口叠放,或者选择一种不会同时出现以上两个窗口的 Layout,比如 Default 布局。

调整以后再进行串流测试,报错随即消失,从而能够正常测试。
并不仅限于 PICO 和 XR
从报错堆栈可以看出,异常发生在 Unity XR 显示子系统获取 Render Pass 的环节。目前更合理的推测是:当 Unity 的多个渲染视图或预览状态同时活跃时------比如 Scene 与 Game 窗口并存、选中了带预览的对象,又叠加了 PDC 串流的渲染流程------就可能触发 Unity 编辑器或 XR 显示子系统的状态同步问题,从而导致请求的 renderPassIndex 与当前可用的 Render Pass 数量不一致。
两种方法的作用,本质上都是减少了同时活跃的渲染视图或预览状态,从而降低触发该同步问题的概率,但目前尚不能确认这就是 Unity 或 PDC 内部的确切实现机制。
另外,这一报错并非 XR 项目专属。在非 XR 项目中,如果 Console 也报出同样的错误但堆栈指向渲染管线,同样值得按上面两种方法进行排查。尤其是方法二,这一思路并非个例。杨栋老师在其著作《创造高清3D虚拟世界》中也有类似建议:烘焙光照贴图时可将 Scene 和 Game 窗口隐藏(如以 Tab 方式叠放),以减少同时渲染带来的开销(P281)。不同的是,杨老师是为了降低烘焙时的性能开销,本文是为了减少报错几率,场景不同,但"避免两个渲染窗口同时呈现"的做法是相通的。
需要说明的是,本文提到的方法并不是解决此类问题的唯一解法,只是尝试解决的手段之一。
最后,使用 PDC 进行 PICO 串流测试时,如果遭遇其它问题,可以参考官方文档中的《PDC问题排查指南》一节。本文涉及的问题和解决方案,目前尚未收录其中。
更多 PICO 开发的系统知识,均集中在以下视频课程中。
