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 源码没有同步到公开仓库。
这会导致:
- 无法直接在公开源码上准确复现和修 3.3.0 的 Bug A/B。
- PR 只能先修公开
2.6.3 源码中存在的 Windows reduced-motion、observer churn、库切换和进程树问题。
- 合并前必须在真实 3.3.0 源码上 rebase,不能直接把旧版 PR 当成 3.3.0 修复。
已提供的修复分支和预构建包
建议处理顺序
- 先公开真实 3.3.0 源码,或至少补一个与发布 engine 对应的 tag。
- 把标题栏拖动层限制为
pointer-events: none,或者保证皮肤按钮 z-index 高于顶栏。
- 修复
qq-stable 主题点自定义无反馈的问题。
- 恢复 Windows 应用内主题切换,并采用脱离 Codex 进程树的启动方式。
- 让
data-reduced-motion="true" 同时控制雨丝、闪电和自定义动态层。
- MutationObserver 忽略皮肤自身 DOM 变化,避免
ensureCalls 自增。
- 在 3.3.0 源码上重新跑 Windows 实机帧率和点击回归测试。
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 行为缺陷。
实测环境
%LOCALAPPDATA%\CodexQQSkin\engineRuntime.evaluate+requestAnimationFrame,同一窗口、每种模式连续采样 2.5 秒diagnostics/cdp-frames.mjs、cdp-perf.mjs、cdp-state.mjs性能数据
QQ 模式已经接近不可用。自定义模式平均帧率看着还可以,但 p95 和最差帧说明仍有周期性的长卡顿。
另外观察到
__CODEX_QQ_SKIN_STATE__.metrics.ensureCalls在 8 秒内从 73 增长到 83,即皮肤自己的 MutationObserver 会被自己创建的 DOM 变化再次触发,反复进入完整ensure流程。这会放大雨丝、雷电和动态角色主题的合成/重绘成本。Bug A:右上角 UI 被原生顶栏遮住,点击无效
3.3.0 的
_ApplicationMenuTopBar_覆盖了整行标题栏:z-index: 40,并带拖动事件#codex-qq-skin-toggle的z-index只有5document.elementFromPoint()在按钮位置返回顶栏,而不是皮肤按钮因此按钮不是 JS 绑定失效,而是命中了更上层的拖动层。
已在本机 3.3.0 engine 验证的单行修复:
原文件 SHA-256:
14BAE7F387173914E0ED795F3E41F4F441C160B84C1B3B364E7D10FDEA125F79修复后 SHA-256:
FC295134946E957E2FC1B77A672474FD78A58E532B8D5F725067522D134B02FA可直接应用附件
Codex-QQ-Skin-3.3.0-toggle-z-index.patch。Bug B:点「自定义」没有反馈
3.3.0 中
CUSTOM_THEME_KINDS仅包含:当当前主题的
kind是qq-stable时,selectSkinMode("custom")会直接return,没有提示,也没有切换。按钮看起来就是“点了没反应”。建议增加可见错误提示,并允许对自定义主题库中的兼容主题做回退选择。Bug C:Windows 应用内切换主题被直接拒绝
scripts/injector.mjs的runLibrarySwitch()在win32直接 reject:但 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 的根节点属性。修复应同时读取:并为 QQ / 自定义主题补上对应的静态 CSS 回退。
Bug E:Windows 重启脚本会被 Codex 连带终止
在 Codex 进程内直接启动
start-qq-skin-windows.ps1 -RestartExisting时,重启到一半 Codex 会把子进程一起杀掉。使用脱离进程树的 WMIWin32_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 源码没有同步到公开仓库。这会导致:
2.6.3源码中存在的 Windows reduced-motion、observer churn、库切换和进程树问题。已提供的修复分支和预构建包
chelsen0806:fix/windows-preflight-performance0cba3e6(修复 reduced-motion、observer churn、Windows 库切换、脱离进程树重载;版本统一为 2.6.4)Codex-QQ-Skin-Windows-x64-v2.6.4.zipSHA-256:
658d26f0cb397b93d6f709de410dd86ff330f4a3367ff98b690218b7ebac1491Codex-QQ-Skin-Windows-x64-v2.6.4-Setup.exeSHA-256:
27dce6c30e621dd9a36e7525567316408f1336ca0134a61faf3254bdec9af25d建议处理顺序
pointer-events: none,或者保证皮肤按钮z-index高于顶栏。qq-stable主题点自定义无反馈的问题。data-reduced-motion="true"同时控制雨丝、闪电和自定义动态层。ensureCalls自增。