[Bug] Qoder CN Windows 启动兼容性机制永久禁用 GPU 加速,远程桌面用户普遍受影响

## 环境信息

  • 应用:Qoder CN v0.3.4 (Electron 43.1.1)
  • 系统:Windows 10/11 x64
  • GPU:NVIDIA RTX 5070 Ti + AMD Radeon 780M

问题描述

Qoder CN 在 Windows 上的 UI 严重卡顿(尤其在设置页面切换模型选项时),原因是 GPU 硬件加速被永久禁用,回退到 CPU 软件渲染(WARP)。

根因分析

通过逆向分析 `out/main/index.js`,发现了一个 **Windows 启动兼容性机制** 会在特定条件下永久禁用 GPU 加速:

触发流程

  1. **首次启动** → `FIA()` 返回 `“normal”` → GPU 正常开启
  2. **某次启动失败**(如远程桌面虚拟显示适配器干扰 GPU 进程)→ 触发 `requestRecovery()` → 带 `–qoder-windows-startup-compatibility` 参数重启
  3. **恢复启动成功** → `completeStartup()` 检测到 `automatic_relaunch` 模式 → 调用 `rememberVersion()` 将当前版本号写入 `windows-startup-compatibility.json`
  4. **之后每次启动** → `FIA()` 检测到 `readRememberedVersion() === applicationVersion` → 返回 `“remembered”` → **永久禁用 GPU**

关键代码(out/main/index.js)

```javascript
// 判断启动模式
function FIA(e) {
return !e.enabled || e.platform !== “win32”
? “disabled”
: e.argv.includes(“–qoder-windows-startup-compatibility”)
? “automatic_relaunch”
: e.stateStore.readRememberedVersion() === e.applicationVersion
? “remembered” // ← GPU 被禁用
: “normal” // ← GPU 正常
}

// 禁用 GPU 加速
function MIA(e, t) {
if (t !== “automatic_relaunch” && t !== “remembered”) return false;
e.disableHardwareAcceleration();
e.commandLine.appendSwitch(“disable-gpu”);
e.commandLine.appendSwitch(“disable-gpu-compositing”);
e.commandLine.appendSwitch(“disable-gpu-sandbox”);
e.commandLine.appendSwitch(“no-sandbox”);
}

// 仅在 automatic_relaunch 成功完成后保存版本
completeStartup() {
if (this.options.mode === “automatic_relaunch”)
return this.options.stateStore.rememberVersion(this.options.applicationVersion);
}
```

验证证据

GPU 进程命令行参数确认:
```
–use-gl=angle --use-angle=d3d11-warp-webgl ← WARP 软件渲染
–disable-gpu-compositing ← GPU 合成被禁用
```

影响范围

**这个问题影响所有使用远程桌面软件的用户**,包括:

  • 向日葵远程控制
  • ToDesk
  • GameViewer
  • UU 远程
  • 其他创建虚拟显示适配器的远程桌面工具

这些软件会安装虚拟显示适配器(如 `GameViewer Virtual Display Adapter`),导致 Chromium GPU 进程初始化失败,触发恢复机制。一旦触发,GPU 加速被永久禁用,UI 严重卡顿,且用户无法自行恢复。

建议修复

短期修复(优先级高)

  1. **在设置中提供"重新启用 GPU 加速"按钮** — 删除或重置 `windows-startup-compatibility.json`
  2. **版本更新后自动重置** — 新版本首次启动应走 `“normal”` 路径尝试重新启用 GPU

中期修复

  1. **缩小触发范围** — 仅在确认是 GPU 相关崩溃时才触发恢复,而非任何启动失败
  2. **排除已知虚拟适配器** — GPU 检测时忽略远程桌面创建的虚拟显示设备(可通过设备名称匹配 `Virtual Display`、`GameViewer`、`Sunflower` 等关键词)

长期修复

  1. **增加 GPU 状态指示** — 在设置中显示当前渲染模式(GPU/CPU),让用户知晓状态
  2. **提供降级策略** — 连续 N 次恢复启动成功后才永久禁用,而非一次就永久生效

临时解决方案(用户侧)

修改版本号使其不匹配当前版本:
```powershell
node -e “require(‘fs’).writeFileSync(process.env.APPDATA+‘/com.qodercn.app.stable/windows-startup-compatibility.json’,‘{\“schemaVersion\”:1,\“applicationVersion\”:\“0.0.0\”}’)”
```
然后重启 Qoder CN。