一年多没碰的 Pico Neo 2,某个周二的下午我突然想戴上重温一下 VR。结果 SteamVR 一启动,pico 加载项直接崩溃——弹窗告诉我”由于最近的崩溃,某些加载项已被自动屏蔽”。问题是:一年前它明明是好的。我没升级过头盔、没换过串流助手,唯一变过的只有 Windows 和显卡驱动。

于是我做了一次完整的取证式排障:从 Windows 事件查看器,到 SteamVR 的 vrserver.txt 日志,再到网上的交叉验证,最终定位到一个相当”时代性”的根因——并用一个日本开发者刚发布 6 天的补丁临时修好了它。这篇文章把整个链条完整记录下来,给同样卡在 e06d7363 的人一个可复现的闭环。

一句话结论:不是 SteamVR 的问题,也不是头盔坏了。是 NVIDIA 驱动升级后移除了旧版 NVENC 编码器 API,而 Pico 串流助手用的还是 2022 年的旧预设 GUID,一调用就崩。修复方式是给它套一层 NVENC 兼容层

症状:SteamVR 自动屏蔽 pico 加载项

最直观的现象就是这个弹窗。SteamVR 检测到 pico 加载项反复导致 vrserver.exe 崩溃,于是把它连同 prism、Gamepad Support 一起自动屏蔽了:

SteamVR 因崩溃自动屏蔽 pico 加载项的弹窗
SteamVR 因崩溃自动屏蔽 pico 加载项的弹窗

点”取消所有屏蔽”能让 pico 驱动重新加载,头盔甚至能被短暂识别——但几秒后又是同样的崩溃,SteamVR 又把它屏蔽回去。一个死循环。

先把环境交代清楚

排障第一步永远是”锁定变量”。我的软件版本和一年前基本没变,只有驱动一路自动更新了:

组件 版本 / 型号 备注
头盔 Pico Neo 2 渲染目标 1664×1664
Pico 游戏串流助手 7.2.3.0(特殊版本) 已停止维护
显卡 NVIDIA GeForce RTX 4090
显卡驱动 610.74 / CUDA 13.3 ← 这就是变量
SteamVR 当前正式版

串流助手停留在 7.2.3.0 这个”特殊版本”,官网早已不再更新:

Pico 游戏串流助手 7.2.3.0 特殊版本设置界面
Pico 游戏串流助手 7.2.3.0 特殊版本设置界面

而显卡驱动已经悄悄爬到了 610.74——这是整个案子的关键。一年前我用的驱动大概还在 5xx 时代:

NVIDIA-SMI 显示驱动 610.74 / RTX 4090
NVIDIA-SMI 显示驱动 610.74 / RTX 4090

证据 #1:Windows 事件查看器

路径:事件查看器 → Windows 日志 → 应用程序 → 来源 Application Error(EventID 1000)

当天一共 6 次崩溃,参数完全相同——这是”确定性崩溃”的典型特征,说明不是随机的内存问题,而是每次都走到同一行代码就爆:

时间 进程 ID 异常代码 偏移量
15:31:50 0x8bec e06d7363 0xc1ada
15:32:32 0x618c e06d7363 0xc1ada
16:20:41 0xb06c e06d7363 0xc1ada
16:21:14 0xd814 e06d7363 0xc1ada
16:22:32 0xdef8 e06d7363 0xc1ada
17:17:21 0xdb9c e06d7363 0xc1ada

把每条记录展开,字段都指向同一个地方:

AppName        = vrserver.exe
AppVersion     = 1.1.1.0
ModuleName     = KERNELBASE.dll
ExceptionCode  = e06d7363          ← C++ 异常 (Visual C++ SEH exception)
FaultingOffset = 00000000000c1ada
AppPath        = ...\SteamVR\bin\win64\vrserver.exe
ModulePath     = C:\WINDOWS\System32\KERNELBASE.dll

关键解读:e06d7363 不是普通的访问违规,它是微软 Visual C++ 抛 C++ 异常时的专用 SEH 代码(0xE0 + "msc" 的 ASCII)。崩在 KERNELBASE.dll 里,意味着某个被调用的底层 API 主动抛了异常——而不是程序自己写崩了。这一步就基本排除了”SteamVR bug”的方向。

证据 #2:SteamVR 日志 vrserver.txt

文件位置:...\Steam\logs\vrserver.txt。这份日志把崩溃的因果顺序完整记录了下来,分四个阶段。

阶段 A — 崩溃前:pico 被安全模式屏蔽

#3748  [Warning] Not loading driver pico because it was blocked
       by a previous safe mode event

这是点”取消所有屏蔽”之前的状态:SteamVR 因为上一次崩溃,自动进了安全模式屏蔽 pico。

阶段 B — 取消屏蔽后:pico 驱动加载,头盔被识别(17:17:20)

#4020  pico: driverpath ...\Streaming Assistant\driver\bin\win64\RVRPlugin.ini
#4028  pico: SetPoseDepth success
#4029  pico: VEncdll Load                              ← 加载视频编码插件
#4038  pico: driver_pico: Serial Number: Pico Neo 2    ← 头盔成功检测到
#4040  pico: driver_pico: Render Target: 1664 1664
#4042  ______COMPOSITOR_INITIALIZE______              ← 合成器开始初始化

阶段 C — 崩溃瞬间(17:17:20.931)

#4043  Exception e06d7363                              ← 砰!

最妙的一个细节:从 COMPOSITOR_INITIALIZEException e06d7363,中间只隔了 0.53 秒——这恰好是初始化 NVENC 硬件编码器所需的时间。崩溃点被精确地钉在了”调用 NVENC”这一刻。

阶段 D — 崩溃后:再次进入安全模式

#4049  Found saved crash timestamp -- Using safe mode
#4097  [Warning] Not loading driver pico because it was blocked
       by a previous safe mode event

于是又回到了阶段 A。死循环闭合。

证据 #3:网上的交叉验证

定位到 NVENC 之后,我去搜了一圈,发现不是我一个人。日本开发者 kakikou 在 2026-07-22 的一篇逆向分析里,贴出了与我逐行一致的崩溃模式:

Faulting application name: vrserver.exe
Faulting module name: KERNELBASE.dll
Exception code: 0xe06d7363

pico: VEncdll Load
pico: driver_pico: Serial Number: Pico Neo 2
______COMPOSITOR_INITIALIZE______
Exception e06d7363

作者通过逆向确认了根因:Pico 的 VEncPlugin.dll 调用了已过期的 NVENC 预设 GUID,新版 NVIDIA 驱动直接拒绝执行。这与我的推断完全吻合——两份来自不同机器、不同人的日志,指向同一行代码。

根因分析:一个”时代性”的兼容断裂

把所有线索拼起来,因果链非常清晰:

Pico 串流助手(2022,已停产)→ 调用旧版 NVENC 预设 GUID → NVIDIA 驱动 582.xx 之后移除了这些旧 API → 驱动抛 C++ 异常 → vrserver.exe 崩溃 → SteamVR 自动屏蔽 pico

换句话说:软件停在过去,驱动走到了未来,中间的 API 桥断了。我的驱动已经是 610.74,远在 582 之后,所以必崩无疑。这也解释了为什么”一年前好好的”——一年前的驱动还认识那套旧 GUID。

根因时间线

时间 发生了什么
15:31 启动 SteamVR → 加载 pico 驱动 → VEncPlugin.dll 调用旧 NVENC 预设 → 驱动不认识 → 崩溃
15:32 SteamVR 重启 → 检测到上次崩溃 → 自动屏蔽 pico → 弹出”加载项已被屏蔽”
16:20–16:22 反复尝试,反复崩溃(事件查看器里那几条)
17:17 点”取消所有屏蔽” → pico 重新加载 → 头盔识别成功 → 合成器初始化 → NVENC 初始化 → 再次 e06d7363
17:17 SteamVR 再次安全模式 → 再次屏蔽 pico

解决方案:NVENC 兼容补丁 PicoNeoCompat

好消息是,就在崩溃前 6 天,日本开发者 kakik0u 发布了开源项目 PicoNeoCompat,专门解决 582.xx 及以后驱动下 Pico Neo 2 / Neo 2 Eye 的这个崩溃。

它的思路很干净:不改动原始驱动,而是插入一层兼容 DLL,把旧的 NVENC 调用实时翻译成新版驱动能接受的格式:

PICO VEncPlugin.dll
      │  以 nvEncCompat64.dll 的身份被加载
      ▼
兼容补丁层
  ├─ 旧预设 GUID      → P1–P7 + tuning info
  ├─ 已废弃的 RC 模式  → CBR / VBR + multipass
  └─ NvEncGetEncodePresetConfig → ...ConfigEx(新版接口)
      │
      ▼
System32\nvEncodeAPI64.dll(真正的 NVIDIA 驱动)

重要:安装需要管理员权限。这个补丁的 Install.bat 会复制 PICO 驱动、修改副本里的 VEncPlugin.dll、并切换 OpenVR 的驱动注册指向——这些操作都要写入 Program Files 下的受保护目录,所以运行安装脚本时 Windows 会弹 UAC,必须选”是”。

安装步骤

步骤 操作
0 确认已装好 SteamVR + Pico 串流助手,并完全退出 SteamVR(检查任务栏托盘也没残留)
1 Releases 下载 PicoNeoCompat-win64.zip 并解压
2 双击 Install.bat,在 UAC 弹窗选“是”(管理员权限)
3 若驱动装在非默认路径,按提示输入,例如 C:\Program Files (x86)\Streaming Assistant\driver
4 若 SteamVR 之前屏蔽过 pico:设置 → 启动/关闭 → 管理加载项 → 给 pico “取消屏蔽” → 重启 SteamVR

如果默认的 Auto 编码设置画面卡顿,可以编辑 ZIP 内的 nvenc_compat.ini 调低负载(退出 SteamVR 后改,再重跑 Install.bat):

[NVENC]
Preset=P3
Tuning=LowLatency
MultiPass=Disabled

作者在 NVIDIA 驱动 596.49 + RTX 3060 Ti 上测试通过。我这边是 610.74 + RTX 4090,补丁同样有效——头盔终于重新亮起来了。卸载也很简单:退出 SteamVR,双击 Uninstall.bat 即可还原原始驱动注册。

备选方案

方案 说明 适用
PicoNeoCompat(推荐) NVENC 兼容层,保留串流助手工作流 想继续用官方串流助手的人
ALVR pico-legacy ALVR 客户端的 Pico Neo 2 分支,更轻量;建议编码器用 HEVC、码率 50–100 Mbps 愿意换一整套串流方案的人
回退 NVIDIA 驱动 降到 581.xx 或更早,让旧 GUID 重新可用 不推荐——会拖累其它需要新驱动的软件

写在最后:这次排障的方法论

这个案子之所以能干净闭环,靠的不是运气,而是一条固定的取证顺序:

先锁变量(软件没变、驱动变了)→ 看系统日志(事件查看器确认确定性崩溃 + 异常代码性质)→ 看应用日志(vrserver.txt 定位崩溃发生在 NVENC 初始化那 0.53 秒)→ 交叉验证(别人的日志逐行一致)→ 锁定根因(旧 NVENC GUID 被新驱动移除)→ 上补丁

一个 e06d7363 看起来像天书,但只要顺着日志一层层剥,它最终会告诉你:软件停在了 2022 年,而你的显卡驱动已经活在 2026 年。


本文记录的是个人排障过程,PicoNeoCompat 为第三方非官方补丁,与 PICO / Valve / NVIDIA 无关,请自行评估风险后使用。