dsh-perf-boost 0.0.0-stage → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +65 -0
- package/LICENSE +21 -0
- package/README.md +116 -2
- package/assets/icon-180.png +0 -0
- package/assets/icon.svg +19 -0
- package/cordis.patch.yml +3 -0
- package/lib/client.js +1230 -0
- package/lib/host/warmup.js +146 -0
- package/lib/index.js +278 -0
- package/package.json +65 -4
package/CHANGELOG.md
ADDED
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# CHANGELOG
|
|
2
|
+
|
|
3
|
+
已发布到 npm 的 0.1.0 为首个版本;其后每个版本号按改动累加。
|
|
4
|
+
|
|
5
|
+
## 更新详情
|
|
6
|
+
|
|
7
|
+
### 0.2.1
|
|
8
|
+
|
|
9
|
+
- 新增了「大会话预热」的开关,设置页里点一下就能关的功能
|
|
10
|
+
- 新增了浅色模式下的配色,开关和分隔线跟着文字颜色走的效果
|
|
11
|
+
- 优化了开关说明的文字,统一改成「可能会导致……」的效果
|
|
12
|
+
- 新增了百分比改成最近 1 分钟窗口,长时间使用不会越用越低的功能
|
|
13
|
+
- 优化了开关列表的顺序,默认开启的排在前面、默认关闭的放在后面的效果
|
|
14
|
+
|
|
15
|
+
### 0.2.0
|
|
16
|
+
|
|
17
|
+
- 新增了设置页「更新详情」,能直接看到每个版本改了什么的功能
|
|
18
|
+
- 新增了滚动时让路,滚动过程中不再扫列表、停手后再补的效果
|
|
19
|
+
- 新增了长任务让路,超过 50 毫秒的卡顿之后等主线程缓过来再扫的效果
|
|
20
|
+
- 新增了视口外图片低优先级解码,把带宽留给看得见的图的效果
|
|
21
|
+
- 新增了窗口不可见时暂停 CSS 动画,合成器不再空转的效果
|
|
22
|
+
- 修复了大会话预热会去读正在写入的会话文件的问题
|
|
23
|
+
- 优化了列表观察范围,从盯整页收窄到只盯消息列表的效果
|
|
24
|
+
- 优化了每个开关的说明,把副作用写清楚的效果
|
|
25
|
+
|
|
26
|
+
## 当前能力
|
|
27
|
+
|
|
28
|
+
- 长对话省渲染:消息列表里屏幕外的条目跳过布局与绘制,预留高度按实测值给。
|
|
29
|
+
- 窗口隐藏不排帧:窗口不可见时不往合成器送帧,切回前台自动恢复。
|
|
30
|
+
- 空闲降帧:20 秒无输入把 JS 驱动的动画降到 30fps,CSS 动画不受影响。
|
|
31
|
+
- 媒体懒加载:图片、视频、iframe 推迟到需要时再解码。
|
|
32
|
+
- 后台暂停定时器:窗口不可见时 `setInterval` 回调全部跳过(不销毁、不重置周期),回前台每个补跳一次。
|
|
33
|
+
- 视口外暂停视频:静音视频滚出视口暂停解码,滚回续播;有声音的不动。
|
|
34
|
+
- 扫描不抢帧:首屏与流式输出期间把扫描推到 `requestIdleCallback`,流式里最多推迟 6 次(约 9 秒);滚动过程中和 50ms 以上的长任务之后也让路,等主线程缓过来再扫。
|
|
35
|
+
- 会话列表节流:流式输出时列表常因「只有 token 计数变了」整树重渲染,这里把这类只改身份的发布攒到每秒一次;可见字段(当前会话、标题、条数、顺序)真变了立刻放行。
|
|
36
|
+
- 大会话预热:启动 15 秒后,把最近用过的 10 个 8MB 以上会话文件分段读进系统文件缓存(4MB 一块、每块歇 40ms、总量上限 400MB、最长 3 分钟),点进去时少等硬盘;只读,不碰会话数据;正在写的会话(10 分钟内改过)会跳过。
|
|
37
|
+
- 每个开关的说明都写清副作用(例如长对话省渲染可能让被跳过的行空白一瞬、会话列表节流的 token 数字最多晚 1 秒)。
|
|
38
|
+
- 可感知的三项默认关:关背景模糊、减少动画、帧率角标。
|
|
39
|
+
|
|
40
|
+
## 已知边界
|
|
41
|
+
|
|
42
|
+
- 会话列表的虚拟滚动属于 `@deepseek-ai/dsh-client-ui-conversation` 上游,插件改不了。
|
|
43
|
+
- 主窗口透明/毛玻璃参数在 `app.asar` 的 main 进程,且只在 macOS 分支生效。
|
|
44
|
+
- 会话投影(打开会话时的 fork/折叠)由宿主内部实现,没有公开的预热接口;硬塞会在签名变化时把宿主弄崩,所以只做文件缓存预热,不做投影预热。
|
|
45
|
+
|
|
46
|
+
## 开发记录
|
|
47
|
+
|
|
48
|
+
- 指标从估算改为实测:rAF 回调、被接管的 `setInterval` 回调、会话列表 `store.set` 发布逐次计时;`≈X%` 只由真实计时得出,样本不足 120ms 显示「—」。自检句柄 `window.__dpbMet`、`window.__dpbMetSnapshot()`。
|
|
49
|
+
- 设置页不再每秒重渲染:快照没变就不渲染、最长 5 秒看一眼、页面在后台跳过;`window.__dpbPanelRenders` 供自检。
|
|
50
|
+
- 上次结果跨启动保留:页面端口每次启动不同,`localStorage` 会失效,所以在宿主侧加 `POST /api/dsh-perf-boost/last-run` 读写 `~/.dsh/perf-boost-last.json`;写盘最多一分钟一次。
|
|
51
|
+
- 卡片只保留大号百分比与一行标题。
|
|
52
|
+
- 审计修复:
|
|
53
|
+
- `≈X%` 不再把「推迟」当「省下」:隐藏期压住的 rAF 回调回前台会补跑,毫秒照样要花;只算真正不再发生的(隐藏期跳过的定时器回调、合并掉的列表发布)。
|
|
54
|
+
- 隐藏期 rAF 队列加上限 200,避免最小化久了攒出大量闭包、回前台一次性跑完卡死。
|
|
55
|
+
- 「媒体懒加载」「视口外暂停视频」关掉时真的还原(`clearMedia()` / `clearViewportMedia()`)。
|
|
56
|
+
- `requestAnimationFrame` 的 id 从 1e9 起,避免与接管前发出的原生 id 撞号。
|
|
57
|
+
- 两个 rAF 开关都关掉时还原原生 `requestAnimationFrame`。
|
|
58
|
+
- 设置页写盘从渲染函数挪进 effect 定时器。
|
|
59
|
+
- 「检查更新」加 9 秒超时。
|
|
60
|
+
- `sessions` 服务晚注册时重试最多 10 次。
|
|
61
|
+
- `store.set` 保留返回值。
|
|
62
|
+
- 长会话里清掉已脱离文档的子项引用。
|
|
63
|
+
- 宿主预热跳过 10 分钟内还在写的会话文件。
|
|
64
|
+
- CI 补跑 `scripts/smoke-client.mjs`;`dsh.client.inject` 与代码实际注入(`slots`/`sessions`)对齐。
|
|
65
|
+
- 文档与索引去掉「帧率上限 / p50/p95 帧时 / 诊断卡片」这些已删功能。
|
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 AlL
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,3 +1,117 @@
|
|
|
1
|
-
#
|
|
1
|
+
# dsh-perf-boost
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
DeepSeek Harness 桌面端的客户端渲染优化插件,全部改动只发生在渲染进程。
|
|
4
|
+
|
|
5
|
+
Client-side rendering optimizations for DSH Desktop.
|
|
6
|
+
|
|
7
|
+
设置入口:**设置 → 性能优化**
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
## 更新详情
|
|
11
|
+
|
|
12
|
+
### 0.2.1
|
|
13
|
+
|
|
14
|
+
- 新增了「大会话预热」的开关,设置页里点一下就能关的功能
|
|
15
|
+
- 新增了浅色模式下的配色,开关和分隔线跟着文字颜色走的效果
|
|
16
|
+
- 优化了开关说明的文字,统一改成「可能会导致……」的效果
|
|
17
|
+
- 新增了百分比改成最近 1 分钟窗口,长时间使用不会越用越低的功能
|
|
18
|
+
- 优化了开关列表的顺序,默认开启的排在前面、默认关闭的放在后面的效果
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
### 0.2.0
|
|
22
|
+
|
|
23
|
+
- 新增了设置页「更新详情」,能直接看到每个版本改了什么的功能
|
|
24
|
+
- 新增了滚动时让路,滚动过程中不再扫列表、停手后再补的效果
|
|
25
|
+
- 新增了长任务让路,超过 50 毫秒的卡顿之后等主线程缓过来再扫的效果
|
|
26
|
+
- 新增了视口外图片低优先级解码,把带宽留给看得见的图的效果
|
|
27
|
+
- 新增了窗口不可见时暂停 CSS 动画,合成器不再空转的效果
|
|
28
|
+
- 修复了大会话预热会去读正在写入的会话文件的问题
|
|
29
|
+
- 优化了列表观察范围,从盯整页收窄到只盯消息列表的效果
|
|
30
|
+
- 优化了每个开关的说明,把可能会导致写清楚的效果
|
|
31
|
+
|
|
32
|
+
## 开关
|
|
33
|
+
|
|
34
|
+
按默认状态排序,前六项默认开启,对观感没有可见影响。
|
|
35
|
+
|
|
36
|
+
| 开关 | 默认 | 影响视觉 | 作用 |
|
|
37
|
+
| --- | --- | --- | --- |
|
|
38
|
+
| 长对话省渲染 | 开 | 无 | 列表子项加 `content-visibility: auto`,占位高度取该列表实测平均子项高度;末尾 4 项与正在流式输出的消息不处理,超过 300px 的代码块同样跳过 |
|
|
39
|
+
| 窗口隐藏不排帧 | 开 | 无 | 页面不可见时 `schedule()` 直接返回;切回时有 `visibilitychange` 钩子恢复,每秒看门狗兜底 |
|
|
40
|
+
| 空闲降帧 | 开 | 无 | 20 秒无输入将 rAF 驱动的动画降到 30fps,有输入立即恢复 |
|
|
41
|
+
| 媒体懒加载 | 开 | 无 | 图片加 `loading=lazy`、`decoding=async`,视频加 `preload=metadata` |
|
|
42
|
+
| 后台暂停定时器 | 开 | 无 | 页面不可见时跳过 `setInterval` 回调,不销毁也不重置周期;回到前台各补跳一次 |
|
|
43
|
+
| 视口外暂停视频 | 开 | 无 | 仅处理静音视频:滚出视口暂停解码,滚回续播 |
|
|
44
|
+
| 会话列表节流 | 开 | 无 | 流式输出时把「只有 token 计数变了」的列表发布攒到每秒一次;可见字段变了立刻放行 |
|
|
45
|
+
| 大会话预热 | 开(宿主侧) | 无 | 启动 15 秒后把最近 10 个 8MB 以上会话分段读进系统文件缓存,只读,跳过 10 分钟内改过的会话 |
|
|
46
|
+
| 关闭背景模糊 | 关 | 有 | 全局 `backdrop-filter: none`,浮层由磨砂改为纯色底 |
|
|
47
|
+
| 减少动画 | 关 | 有 | 动画与过渡时长置 0.001ms,弹窗不再逐帧动 |
|
|
48
|
+
| 帧率角标 | 关 | 有 | 右下角显示 `NN fps` |
|
|
49
|
+
|
|
50
|
+
每个开关的说明里都标了可能会导致,这里汇总一次:
|
|
51
|
+
|
|
52
|
+
| 开关 | 可能会导致 |
|
|
53
|
+
| --- | --- |
|
|
54
|
+
| 长对话省渲染 | 快速滚动时,被跳过的行可能空白一瞬,紧接着补上 |
|
|
55
|
+
| 窗口隐藏不排帧 | 后台标签页里的动画会停,切回前台补一帧 |
|
|
56
|
+
| 空闲降帧 | 长时间不动,动画看起来变慢;动一下鼠标立刻恢复 |
|
|
57
|
+
| 媒体懒加载 | 快速拖到很远处的图片可能先白一下再出来 |
|
|
58
|
+
| 后台暂停定时器 | 隐藏期间攒下的轮询只补一次,个别插件会看到一次跳变 |
|
|
59
|
+
| 视口外暂停视频 | 滚回来时可能黑一下或重新缓冲 |
|
|
60
|
+
| 会话列表节流 | 侧栏 token 数字最多晚 1 秒才跳 |
|
|
61
|
+
| 大会话预热 | 读盘那几十秒里机械盘/低配机器打开会话可能反而慢一点,磁盘占用升高 |
|
|
62
|
+
|
|
63
|
+
不提供预设档位。
|
|
64
|
+
|
|
65
|
+
## 验证
|
|
66
|
+
|
|
67
|
+
- 「长对话省渲染」行下方显示 `已生效:N 个列表,跳过 M 项渲染(共 K 项)`
|
|
68
|
+
- 打开「帧率角标」,右下角出现 fps 小方块
|
|
69
|
+
- 控制台 `window.__dpbRaf`、`window.__dpbTimers` 为 `true`,表示 rAF 与定时器接管成功
|
|
70
|
+
|
|
71
|
+
角标读数为浏览器实际送帧数,上限等于显示器刷新率。帧时、DOM 节点等细分数据请用 DevTools 的 Performance 面板录制,插件不做常驻采样。
|
|
72
|
+
|
|
73
|
+
## 实测
|
|
74
|
+
|
|
75
|
+
Windows 桌面端,200Hz 显示器,缩放 100%:
|
|
76
|
+
|
|
77
|
+
| 场景 | 帧率 | p50 帧时(DevTools) |
|
|
78
|
+
| --- | --- | --- |
|
|
79
|
+
| 空白页(同机 Edge) | 187–200 | 5.0 ms |
|
|
80
|
+
| DSH 页面(新会话,DOM 1218) | 200 | 5.0 ms |
|
|
81
|
+
| DSH 桌面端(2.3 万事件会话) | 约 156 | ≈6.4 ms |
|
|
82
|
+
|
|
83
|
+
页面代码本身可以跑满刷新率,差距来自长会话的 DOM 体量与 Electron 窗口合成。
|
|
84
|
+
|
|
85
|
+
## 安装
|
|
86
|
+
|
|
87
|
+
```bash
|
|
88
|
+
pnpm add dsh-perf-boost
|
|
89
|
+
pnpm add github:AlLHHH/dsh-perf-boost
|
|
90
|
+
pnpm add file:./dsh-perf-boost
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
将 `dsh-perf-boost` 加入 profile 的 `dsh.profile.bundles`,重启应用生效;卸载时从 bundles 移除并重启。
|
|
94
|
+
|
|
95
|
+
## 实现说明
|
|
96
|
+
|
|
97
|
+
- 只修改当前渲染进程:不改宿主代码,不落盘配置,不发送遥测。配置存于 `localStorage['dsh-perf-boost:cfg']`。
|
|
98
|
+
- 唯一的网络请求是「检查更新」:页面 POST 到 `/api/dsh-perf-boost/update-check`,由宿主查询 npm 的 latest(CSP 限制页面不能直接跨域)。查询失败显示「未查到」,不影响功能。
|
|
99
|
+
- `requestAnimationFrame` 仅在启用「窗口隐藏不排帧」或「空闲降帧」时接管,否则保持原生实现。
|
|
100
|
+
|
|
101
|
+
大会话预热可以在设置页里关掉,也可以在插件配置里写 `warmup: false` 一次性关掉。
|
|
102
|
+
|
|
103
|
+
## 已知限制
|
|
104
|
+
|
|
105
|
+
- 窗口的 `transparent` / `vibrancy` 由应用自身(`app.asar` 的 `lib/main.js`)决定,Windows 分支不透明,插件无法修改。
|
|
106
|
+
- 省渲染只减少布局与绘制,消息节点仍在内存中,超长会话的滚动开销依然存在。
|
|
107
|
+
- 媒体懒加载只修改属性,不改动 DOM 结构,已加载的图片不会被回收。
|
|
108
|
+
|
|
109
|
+
## 兼容
|
|
110
|
+
|
|
111
|
+
- `engines.dsh >= 0.2.0-0`,实测 0.2.1-rc.3(桌面版 0.2.1.0)
|
|
112
|
+
- peer `@deepseek-ai/cordis ^4.0.1`,实测 4.0.5
|
|
113
|
+
- 依赖客户端插件 API:`window.__ModuleLoader__.load`、`slots`(`settings.section`)、`require('react')`
|
|
114
|
+
|
|
115
|
+
## 许可
|
|
116
|
+
|
|
117
|
+
MIT
|
|
Binary file
|
package/assets/icon.svg
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="256" height="256" viewBox="0 0 256 256">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bg" x1="0" y1="0" x2="1" y2="1">
|
|
4
|
+
<stop offset="0" stop-color="#1b1f2e"/>
|
|
5
|
+
<stop offset="1" stop-color="#0d1018"/>
|
|
6
|
+
</linearGradient>
|
|
7
|
+
<linearGradient id="accent" x1="0" y1="0" x2="1" y2="0">
|
|
8
|
+
<stop offset="0" stop-color="#4d6bfe"/>
|
|
9
|
+
<stop offset="1" stop-color="#4fd1c5"/>
|
|
10
|
+
</linearGradient>
|
|
11
|
+
</defs>
|
|
12
|
+
<rect width="256" height="256" rx="56" fill="url(#bg)"/>
|
|
13
|
+
<path d="M52 168a76 76 0 0 1 152 0" fill="none" stroke="#2a3350" stroke-width="16" stroke-linecap="round"/>
|
|
14
|
+
<path d="M52 168a76 76 0 0 1 70-75.8" fill="none" stroke="url(#accent)" stroke-width="16" stroke-linecap="round"/>
|
|
15
|
+
<path d="M128 92v-14" stroke="#4fd1c5" stroke-width="14" stroke-linecap="round"/>
|
|
16
|
+
<path d="M128 168 168 126" stroke="#e8ecff" stroke-width="14" stroke-linecap="round"/>
|
|
17
|
+
<circle cx="128" cy="168" r="13" fill="#4d6bfe"/>
|
|
18
|
+
<path d="M96 196h64" stroke="#2a3350" stroke-width="12" stroke-linecap="round"/>
|
|
19
|
+
</svg>
|
package/cordis.patch.yml
ADDED