Skip to content

[Windows] 3.3.0 QQ 模式掉到约 10 FPS,右上角皮肤按钮点不动 #26

Description

@chelsen0806

Codex QQ Skin 3.3.0 Windows 性能与交互回归报告

结论

在 Windows 11 22621 + Codex Desktop 152.0.7977.83 + Codex QQ Skin 3.3.0 上,可以稳定复现 QQ 模式严重掉帧、自定义主题长卡顿、右上角皮肤菜单点不动。它不是单纯“动画多”的观感问题,至少包含 3 个明确的代码回归和 2 个 Windows 行为缺陷。

实测环境

  • 系统:Windows 11 22H2,NT 10.0.22621,x64,16 核
  • Codex Desktop:152.0.7977.83
  • Codex QQ Skin:3.3.0
  • 安装目录:%LOCALAPPDATA%\CodexQQSkin\engine
  • 测量方式:CDP Runtime.evaluate + requestAnimationFrame,同一窗口、每种模式连续采样 2.5 秒
  • 诊断脚本:本报告附件 diagnostics/cdp-frames.mjs、cdp-perf.mjs、cdp-state.mjs

性能数据

模式 FPS 平均帧时间 p95 最差帧 >50ms 帧数
Codex 原生 ~180 5.54 ms 6.1 ms 8.3 ms 0
QQ 经典 9.9 101.44 ms 145.4 ms 145.4 ms 19
自定义 / Neon Storm 104 9.58 ms 33.2 ms 170.6 ms 9

QQ 模式已经接近不可用。自定义模式平均帧率看着还可以,但 p95 和最差帧说明仍有周期性的长卡顿。

另外观察到 __CODEX_QQ_SKIN_STATE__.metrics.ensureCalls 在 8 秒内从 73 增长到 83,即皮肤自己的 MutationObserver 会被自己创建的 DOM 变化再次触发,反复进入完整 ensure 流程。这会放大雨丝、雷电和动态角色主题的合成/重绘成本。

Bug A:右上角 UI 被原生顶栏遮住,点击无效

3.3.0 的 _ApplicationMenuTopBar_ 覆盖了整行标题栏:

  • 顶栏尺寸约为整宽 × 36px,z-index: 40,并带拖动事件
  • #codex-qq-skin-toggle 的 z-index 只有 5
  • document.elementFromPoint() 在按钮位置返回顶栏,而不是皮肤按钮

因此按钮不是 JS 绑定失效,而是命中了更上层的拖动层。

已在本机 3.3.0 engine 验证的单行修复:

--- a/assets/renderer-inject.js
+++ b/assets/renderer-inject.js
@@ -4827,7 +4827,7 @@
-    control.style.zIndex = inRetroTitlebar || controlsHost === document.body ? "5" : "auto";
+    control.style.zIndex = inRetroTitlebar || controlsHost === document.body ? "60" : "auto";

原文件 SHA-256:14BAE7F387173914E0ED795F3E41F4F441C160B84C1B3B364E7D10FDEA125F79
修复后 SHA-256:FC295134946E957E2FC1B77A672474FD78A58E532B8D5F725067522D134B02FA
可直接应用附件 Codex-QQ-Skin-3.3.0-toggle-z-index.patch。

Bug B:点「自定义」没有反馈

3.3.0 中 CUSTOM_THEME_KINDS 仅包含:

new Set(["custom-native", "deep-custom"])

当当前主题的 kind 是 qq-stable 时,selectSkinMode("custom") 会直接 return,没有提示,也没有切换。按钮看起来就是“点了没反应”。建议增加可见错误提示,并允许对自定义主题库中的兼容主题做回退选择。

Bug C:Windows 应用内切换主题被直接拒绝

scripts/injector.mjs 的 runLibrarySwitch() 在 win32 直接 reject:

In-app library switching is currently macOS-only

但 Windows 已经有 scripts/windows/switch-theme-windows.ps1。结果是皮肤库里点主题只能失败。修复版改为通过 Invoke-CimMethod -ClassName Win32_Process -MethodName Create 启动 Windows 切换脚本,并恢复 Windows 的切换轮询。

Bug D:data-reduced-motion="true" 没有被真正执行

实机已经给根节点设置 data-reduced-motion="true",但 QQ 雨丝和雷电动画仍然持续运行。当前渲染器只读取 matchMedia("(prefers-reduced-motion: reduce)"),CSS 也没有覆盖 Codex 26.9 的根节点属性。修复应同时读取:

window.matchMedia("(prefers-reduced-motion: reduce)").matches ||
document.documentElement.getAttribute("data-reduced-motion") === "true"

并为 QQ / 自定义主题补上对应的静态 CSS 回退。

Bug E:Windows 重启脚本会被 Codex 连带终止

在 Codex 进程内直接启动 start-qq-skin-windows.ps1 -RestartExisting 时,重启到一半 Codex 会把子进程一起杀掉。使用脱离进程树的 WMI Win32_Process.Create 后可以完成切换。这个问题和新版应用退出/重启机制有关,不能只靠普通 spawn() 修。

上游源码和 3.3.0 发布包不一致

反馈时仓库 zhulin025/Codex-QQ-Skin 的 main 停在 6ba0877,package.json 仍是 2.6.3;但标签 v3.2.1~v3.3.0 全部指向同一个旧提交,GitHub Release 却发布了 3.3.0 安装包。也就是说 3.3.0 的实际 engine 源码没有同步到公开仓库。

这会导致:

  1. 无法直接在公开源码上准确复现和修 3.3.0 的 Bug A/B。
  2. PR 只能先修公开 2.6.3 源码中存在的 Windows reduced-motion、observer churn、库切换和进程树问题。
  3. 合并前必须在真实 3.3.0 源码上 rebase,不能直接把旧版 PR 当成 3.3.0 修复。

已提供的修复分支和预构建包

  • 分支:chelsen0806:fix/windows-preflight-performance
  • 提交:0cba3e6(修复 reduced-motion、observer churn、Windows 库切换、脱离进程树重载;版本统一为 2.6.4)
  • 修复 PR:fix(windows): restore switching and reduce skin churn #27
  • 预发布页:https://github.com/chelsen0806/Codex-QQ-Skin/releases/tag/v2.6.4-preflight
  • Codex-QQ-Skin-Windows-x64-v2.6.4.zip
    SHA-256:658d26f0cb397b93d6f709de410dd86ff330f4a3367ff98b690218b7ebac1491
  • Codex-QQ-Skin-Windows-x64-v2.6.4-Setup.exe
    SHA-256:27dce6c30e621dd9a36e7525567316408f1336ca0134a61faf3254bdec9af25d
  • 公开源码回归测试:全部 PASS
  • 说明:2.6.4 包基于公开仓库旧源码;3.3.0 的 Bug A 已附可直接应用的补丁,但无法诚实地宣称它已被完整打进 3.3.0 发布包。

建议处理顺序

  1. 先公开真实 3.3.0 源码,或至少补一个与发布 engine 对应的 tag。
  2. 把标题栏拖动层限制为 pointer-events: none,或者保证皮肤按钮 z-index 高于顶栏。
  3. 修复 qq-stable 主题点自定义无反馈的问题。
  4. 恢复 Windows 应用内主题切换,并采用脱离 Codex 进程树的启动方式。
  5. 让 data-reduced-motion="true" 同时控制雨丝、闪电和自定义动态层。
  6. MutationObserver 忽略皮肤自身 DOM 变化,避免 ensureCalls 自增。
  7. 在 3.3.0 源码上重新跑 Windows 实机帧率和点击回归测试。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions