结论
Escape from Tarkov 更新版本后进不去战局,报错提示:
- 中文:发生一个或多个错误
- 英文:one or more errors occurred
并且局内有概率看到紫色渲染(缺失贴图的占位色)。
如果同时满足「单人不触发 / 组队才炸」,那基本可以确定是跨版本残留着色器缓存的问题。
解决方案
完全退出游戏和启动器,然后删掉这三个目录的内容:
%LOCALAPPDATA%\NVIDIA\DXCache%LOCALAPPDATA%\NVIDIA\GLCache%LOCALAPPDATA%\D3DSCache一键脚本
先完全退出游戏和启动器,然后以 PowerShell 执行:
$targets = @( "$env:LOCALAPPDATA\NVIDIA\DXCache", "$env:LOCALAPPDATA\NVIDIA\GLCache", "$env:LOCALAPPDATA\D3DSCache")
# 安全护栏:只允许操作这三个解析后的绝对路径(自动取当前用户,无需手改)$allowed = @( (Join-Path $env:LOCALAPPDATA 'NVIDIA\DXCache'), (Join-Path $env:LOCALAPPDATA 'NVIDIA\GLCache'), (Join-Path $env:LOCALAPPDATA 'D3DSCache')) | ForEach-Object { (Get-Item -LiteralPath $_ -Force -ErrorAction SilentlyContinue).FullName } | Where-Object { $_ }
foreach ($t in $targets) { $full = (Get-Item -LiteralPath $t -Force).FullName if ($allowed -notcontains $full) { "ABORT: 意外路径 $full"; continue }
$before = (Get-ChildItem -LiteralPath $full -Recurse -File -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum) "--- $full : 清理前 {0:N1} MB / {1} 个文件" -f ($before.Sum/1MB), $before.Count
# 只删目录内容,保留目录本身,让驱动自行重建 Get-ChildItem -LiteralPath $full -Force -ErrorAction SilentlyContinue | ForEach-Object { Remove-Item -LiteralPath $_.FullName -Recurse -Force -ErrorAction SilentlyContinue }
$after = (Get-ChildItem -LiteralPath $full -Recurse -File -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum) $rem = if ($null -eq $after.Sum) { 0 } else { $after.Sum } " 清理后 {0:N1} MB / {1} 个文件 | 释放 {2:N1} MB" -f ($rem/1MB), $after.Count, (($before.Sum - $rem)/1MB)}脚本无需任何手改,路径自动按当前用户解析。
$allowed只是防手滑的护栏,不想要可以直接删掉那几行。
实测效果
| 目标 | 清理前 | 清理后 | 释放 |
|---|---|---|---|
| NVIDIA DXCache | 4783.7 MB / 436 文件 | 17.8 MB / 19 文件 | 4765.9 MB |
| NVIDIA GLCache | 162.5 MB / 32 文件 | 0 MB | 162.5 MB |
| D3DSCache | 7.9 MB / 112 文件 | 0 MB | 7.9 MB |
| 合计 | ≈ 4.93 GB |
清理后组队进战局恢复正常,紫色渲染不再出现。
修复速查表
| 项 | 内容 |
|---|---|
| 触发条件 | 游戏版本更新后未清缓存 + 多人组队 |
| 报错关键词 | 发生一个或多个错误 / one or more errors occurred |
| 伴随症状 | 局内紫色渲染、缺失贴图 |
| 根因 | 跨版本残留着色器缓存与新版引擎不兼容,prewarm 失败导致组队路径 profile 重建崩溃 |
| 修复 | 清理 NVIDIA\DXCache、NVIDIA\GLCache、D3DSCache |
| 代价 | 首次进图重新编译着色器,前几局略卡,之后恢复 |
别删错东西
下面这些不是缓存,不要动:
| 路径 | 说明 |
|---|---|
build\EscapeFromTarkov_Data\...\shaders | 游戏资源文件,不是缓存 |
BsgLauncher\CefCache | 启动器内嵌浏览器缓存,含登录态,删了要重新登录 |
删不干净是正常的
DXCache 里会剩下十几个 .nvph 文件(本次是 19 个 / 17.8 MB)删不掉,因为被这些正在跑的进程占用着:
dwm 桌面窗口管理器explorer 资源管理器nvcontainer / NVDisplay.ContainerNVIDIA Overlaysteamwebhelper它们时刻在用 GPU,句柄不会释放。占比极小,不用管;下次重启后想删再删一次即可。
养成习惯:每次 EFT 大版本更新后,先清一次着色器缓存再进游戏。
事件报告
下面是完整的复现条件与排查过程,留档备查。
问题现象
Escape from Tarkov 更新到 1.2.5.0.48146 之后,出现了一个很恶心的故障:
- 单人进战局正常,不触发
- 多人组队进战局必炸,弹出「一个或者更多的错误」
- 局内有概率看到紫色渲染(缺失贴图的经典表现)
复现条件很明确:更新游戏后没有清理缓存。
组合起来就是:单人不触发 + 组队必触发 + 紫块。看起来很像网络问题或者服务端问题,其实都不是。
日志位置
EFT 如果是 Steam 装的,日志不在 Battlestate 目录下,而是在游戏根目录:
C:\Program Files (x86)\Steam\steamapps\common\Escape from Tarkov\build\Logs\每次启动会生成一个 log_日期_时间_版本号 的目录,里面最有用的是:
| 文件 | 作用 |
|---|---|
*errors_000.log | 错误与异常堆栈 |
*backend_000.log | 所有 HTTP 请求/响应 |
*output_000.log | 主日志(很大,用 grep 捞) |
*files-checker_000.log | 文件一致性校验 |
关键证据
在 output_000.log 里按时间捞出失败瞬间的上下文:
17:52:28 WebSocket: payloadType=groupMatchStartGame ← 服务器让进战局17:52:29 files-checker: Consistency ensurance is succeed17:52:33 MatchingCompleted / scene preset: factory_day ← 匹配成功,目标地图 Factory17:52:56 LocationLoaded ← 地图已加载完17:52:56 Network game matching aborted. ErrorCode: 0 ← 崩在这17:52:57 Error| AggregateException17:53:13 ArgumentNullException: Value cannot be null. Parameter name: source at EFT.EftClientBackendSession.SetProfiles (EFT.ProfileDescriptor[] profilesData)这里有个反直觉的点:报错信息长得像网络故障,但 backend_000.log 里整场请求全部 200,耗时 0.3~1.5 秒,一切正常:
<--- Response HTTPS, id [35]: /client/game/profile/select, SumSeconds: 0.976<--- Response HTTPS, id [70]: /client/match/raid/ready, SumSeconds: 1.052网络层是干净的,锅不在网络。
为什么单人不炸、组队才炸
这才是定位的关键。
- 单人:进图流程简单,直接由本地会话接管,不经过完整的 group matching 状态机。
- 组队:要走
NetworkGameMatching,服务器下发groupMatchStartGame之后,客户端需要在加载地图的同时重建整份 profile 数据(队友信息、战局池、场景预设)。这条路径更长,会去读着色器缓存。
而 SetProfiles 收到的是 null 数组,随后在 System.Linq.Enumerable.Select 上直接炸掉——profile 重建失败,于是弹错误屏。
再往前追,17:52:36 其实已经埋了雷:
Warn|output| Failed prewarm shot delegate because System.NullReferenceExceptionprewarm(预渲染)已经出问题了 —— 这正是着色器缓存出问题的直接信号。
紫色渲染的解释
紫色 = Shader 编译失败 / 贴图缺失 的经典占位色。
版本更新后,旧的着色器缓存二进制与新版引擎不兼容,但游戏仍然尝试复用:
- 能读的旧缓存 → 硬用 → 渲染异常/紫块
- 读不了的旧缓存 → 抛异常 → prewarm 失败 → 继续往上冒泡 → 组队路径的 profile 重建崩掉
所以紫块和进不去战局是同一个根因的两个症状,不是两个独立问题。
相关但无关的现象
日志里会刷屏:
Warn|output| Renderer 'shadow' is registered with more than one LODGroup这是地图资源注册的已知老噪音,跟本故障无关,不用理会。
为什么单人不触发
再强调一次,因为这点最容易误导排查方向:单人进图走的是短路径,不经过完整的 group matching 状态机,所以即使缓存是坏的也可能侥幸进图。别因为”单人能进”就排除缓存问题。
检索关键词
方便日后搜索,本故障的常见表述:
発生一個或多個錯誤、发生一个或多个错误、一个或多个错误、one or more errors occurred、An error occurred、进不去战局、无法进入战局、匹配成功但进不去、组队进不去、单人正常组队报错、紫色渲染、紫色贴图、缺失贴图、紫块、着色器缓存、ShaderCache、DXCache、D3DSCache、SetProfiles、ArgumentNullException、Network game matching aborted、prewarm shot delegate、EFT 更新后进不去、Tarkov 更新后报错、Escape from Tarkov 缓存清理。