Repository navigation
fix(desktop): 状态栏帧数改为界面线程可用帧数,去掉单位并收紧间距 - #1929
Merged
Merged
Conversation
- 帧数原来统计每秒重绘次数,Viva 只在内容变化时重绘,空闲窗口只为光标闪烁重绘,所以显示 2。 改为测量界面线程:给窗口的每个回调计时,超过一帧的连续工作按跨过的帧数扣除, 读数 = 屏幕刷新率 - 最近一秒被占用的帧数。空闲或后台任务运行时等于刷新率,界面线程卡住时下降。 - 刷新率取动画连续帧间隔的中位数,并贴近到常见刷新率;测到之前按 60 Hz 计算。 - 只在读数会变化时请求补帧;测量器自己请求的那一帧不计入,空闲时不会自己循环重绘。 - 状态栏只显示数字,悬停提示说明含义(新增 desktop.status.fpsTooltip,删除 fpsValue)。 - 状态栏项内边距 8 改为 6,项间距 4 改为 0,相邻读数间隔从 20pt 收紧到 12pt;拖动插入线和通知铃铛同步。
xiaoyumuxi
marked this pull request as ready for review
November 14, 2026 13:48
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
关联 Issue / Linked issue
PR 类型 / Type
改动说明 / What changes
背景 / Why
状态栏的帧数在空闲时显示 “2 FPS”。原来的计数器统计每秒重绘了几次,而 Viva 只在需要时才重绘:窗口空闲时只有光标闪烁会触发重绘,大约每秒 2 次,于是显示成 2,看起来像界面卡住了。这个数字本来是用来区分“界面线程卡住”和“后台任务还没跑完”的,统计重绘次数分不出这两种情况。另外,状态栏各项之间间距偏大,“FPS” 单位也占地方。
改动 / Changes
desktop/internal/workbench/frame_meter.go,新增):显示最近一秒内界面线程来得及显示的帧数,不再统计重绘了多少次。window_sessions.go的config()包装了 OnWake/OnPaint/指针/键盘/滚动/文件拖放/关闭等回调,新增泛型timedEvent)。相邻不到 1ms 的回调合成一段忙碌时间;长度为 L 的忙碌段占掉(L*刷新率-1)/1s帧。max(刷新率 − 最近 1 秒内结束的忙碌段(含进行中的一段)占掉的帧数, 0)。空闲时等于屏幕刷新率;界面线程卡住时下降,卡顿结束一秒后恢复;后台 goroutine 跑任务不占用窗口线程,所以不会拉低读数。chrome.go的itemFPS用strconv.Itoa)。悬停提示里解释这个数字的含义(新增词条desktop.status.fpsTooltip,原来的desktop.status.fpsValue/FPSValue已删除)。chromeStatusPad = 6、chromeStatusGap = 0。状态栏各项改为水平内边距 6、项与项之间间距 0(chrome_view.go的状态栏区域、chromeStatusItem、notifications.go的铃铛按钮),两项文字之间从约 20pt 缩小到 12pt,悬停高亮仍然覆盖整项。drag.go里拖动排序时使用同一个间距,落点计算和实际布局保持一致。app.go的statusState类型和status字段;root.go的beginPaint()不再传 canvas,也不再调用a.status.frame(...);删除runtime_messages.go的statusFPS。shared/i18n/messages.json和中英 locale 已更新,生成结果shared.generated.go由generate-i18n.mjs产生;messages.go、zh.go、en.go改用FPSTooltip;同步更新i18n_test.go。frame_meter_test.go,覆盖空闲读数、后台任务不影响读数、500ms 卡顿读数为 31 并在一秒后恢复、同一次重绘的多笔绘制合并计算、计量器自己的绘制不会连续请求、事件后的绘制照常计入、120/144/75/72/59.94Hz 的刷新率测量、跳过显示器没有运行的间隔、事件绘制不影响刷新率、没有绘制时只保留最近一秒等场景。app_test.go新增TestStatusBarItemsSitClose(相邻状态项高亮之间间距等于chromeStatusGap)和TestStatusBarFrameReadoutIsTheBareRate(整窗 harness 回归测试)。不在本 PR 范围内 / Out of scope
类型专属:fix
复现与根因
git log -S或git blame查):0faecba49(Epic(0.7.0): 基于 Viva 框架的跨平台方案的迁移(#1794) #1799,Viva 迁移)引入的statusState.frame统计每秒 paint 次数;Viva 按需重绘,空闲时只有光标闪烁触发重绘。检查项
desktop/internal/workbench/app_test.go的TestStatusBarFrameReadoutIsTheBareRate,修复前失败,输出为读数"2 FPS",期望"60"statusState、FPSValue、statusFPS、fpsValue、beginPaint已全部更新或删除.agents/notes/implemented/bug-fix/记录:读数的定义和取舍已写在frame_meter.go的注释和测试里,不需要单独的 Note范围检查 / Scope checks
功能矩阵 / Feature matrix
shared/platform-feature-matrix/features/<id>.json:没有新增能力,状态栏帧数项本来就存在,两端行为一致./scripts/platform-feature-matrix/verify-platform-feature-matrix.sh(189 个能力通过);改了平台实现路径的,还运行了./scripts/platform-feature-matrix/verify-platform-feature-matrix-change.sh origin/preview HEAD(matrix change gate passed).artifacts/下生成的矩阵视图插件归属 / Plugin ownership
develop-lithe第三节“插件归属与宿主零依赖”的自查命令,结果为空:只改宿主状态栏,不涉及任何插件shared/i18n/;插件构建步骤、资源路径和补丁没有写进宿主资源说明统一日志系统 / Structured logging
N/A:没有新增或改动生命周期里程碑、终态、降级或失败路径;计量器在高频路径上,不写日志。
界面文案 / i18n
shared/i18n/补齐中英词条desktop.status.fpsTooltip,运行node scripts/i18n/generate-i18n.mjs并提交生成结果,没有手改生成文件;Viva 代码通过desktop/internal/i18n/的接口读取node scripts/i18n/verify-app-language-localization.mjs和node scripts/i18n/generate-i18n.mjs --check,没有放宽脚本或扩大豁免名单逻辑归属 / Logic placement
性能与内存 / Performance and memory
desktop/internal/editor/**、editorview/**,不涉及启动、打开项目、输入、滚动、大文件、长输出或搜索的处理路径设置 / Settings
N/A:没有新增或修改设置项。
插件契约 / Plugin contract
N/A:没有改动插件契约、能力版本、插件函数协议、宿主方法或通知。
发行包与资源 / Bundle and resources
N/A:没有新增运行时资源、缓存、下载物或构建资源步骤。
无用代码与重构 / Dead code and refactoring
statusState、status字段、statusFPS、FPSValue/desktop.status.fpsValuerefactor标签的 Issue:没有发现验证 / Verification
scripts/desktop/desktop-go.sh vet ./internal/workbench/... ./internal/i18n/...scripts/desktop/desktop-go.sh test ./internal/workbench/... ./internal/i18n/...go test -race -run TestFrameMeter ./internal/workbench/origin/preview(b08c3ecab)后重跑 vet 和TestFrameMeter、TestStatusBar、TestWorkbenchDefaultLayout、TestStatusItem、Drag、TestTerminalAndStatus、HTML/Preview 相关测试node scripts/i18n/verify-app-language-localization.mjsnode scripts/i18n/generate-i18n.mjs --check./scripts/platform-feature-matrix/verify-platform-feature-matrix.sh./scripts/platform-feature-matrix/verify-platform-feature-matrix-change.sh origin/preview HEADgofmt -l改动文件未能执行的检查和原因:
提交前确认 / Final checks
preview创建(已变基到 b08c3ec);目标分支:preview.build/、target/、dist/、.artifacts/等产物,没有凭据、个人路径和未脱敏的日志或截图