Appearance
P0 SR 黑屏 / 卡顿 / 自杀根因
这不是一个单点 crash,而是一条连续的事故链:内存泄漏 → 渲染线程卡死 → Unity watchdog 触发自杀。
事故等级P0
复现方式2h 台架
关键阈值20s 卡死
背景
2026 年 4 月,610 版本线上出现 SR 黑屏、明显卡顿和 Unity 进程异常终止。单看每个症状,它们像是三个问题:画面黑、帧率低、进程自杀。但线上事故处理不能按现象拆碎,必须找到一条能解释全部症状的根因链。
现象
| 现象 | 用户感知 | 工程风险 |
|---|---|---|
| SR 黑屏 | 画面偶发不可用 | 渲染链路中断 |
| 明显卡顿 | 帧率从 60fps 掉到 10fps 以下 | 主体验受损 |
| 进程自杀 | Unity 进程异常退出 | 稳定性事故 |
排查过程
1. 排除表面假设
| 假设 | 验证 | 结论 |
|---|---|---|
| GPU 驱动问题 | 多设备复现 | 不是单设备驱动 |
| 特定场景触发 | 随机场景出现 | 非固定场景 |
| 网络数据异常 | 离线也能复现 | 非网络根因 |
2. 台架复现
人工排查很难稳定抓到现场,因此改用台架长时间自动测试。连续跑约 2 小时后复现,再拉 trace 和日志分析。
3. 串起根因链
mermaid
flowchart TD
A[大纹理未及时释放] --> B[内存持续上升]
B --> C[渲染线程等待 GPU 资源释放<br>卡死约 20 秒]
C --> D[Unity watchdog 判定<br>渲染线程不可恢复]
D --> E[触发进程自杀保护]
B -.表现为.-> F[卡顿 60fps → 10fps-]
C -.表现为.-> G[SR 黑屏]这条链路同时解释黑屏、卡顿和自杀:黑屏是渲染不可用的表现,卡顿是资源等待的过程,自杀是 watchdog 的保护结果。
修复方案
紧急止血
- 定位泄漏的大纹理对象,补显式释放逻辑。
- 对渲染线程卡死风险增加降级策略,例如降低分辨率、关闭部分后处理。
长期防线
- 建立内存预警:内存超过阈值时主动降级。
- 建立线上 record:用环形 buffer 记录事故前后关键事件,便于复盘。
- 将 crash、卡顿、内存、渲染状态纳入统一监控链路。
产出
- P0 事故根因链。
- 台架自动复现路径。
- 紧急修复方案和长期治理方向。
- 后续稳定性治理的监控口径。
可复用方法论
- P0 事故要先找能解释全部症状的链路。
- 不能稳定复现时,优先搭自动化场景,而不是继续猜。
- watchdog 自杀通常是保护结果,根因要往上游资源链路找。
- 复盘产物必须转成监控和发布标准,否则下次还会靠人肉经验。
复盘
这篇案例后续还需要补充脱敏后的 trace 分析图、内存趋势图和降级策略表。当前版本只保留公开可描述的方法论和已在原文出现的关键数字。