fix(display): 大屏数字不再依赖帧回调(被遮挡时卡住)+ Console 关遮挡节流 + resync 冷却期排队;版本 dev_0.5.13
现场:清空本组后,大屏上的「单位总分」要等几十秒才降下来。 根因不在「清空」这条路:服务端在同一个事务里就把流水作废重写、算出整张榜单并推送, 与「撤销发布」逐条同构(results_clear.go / scoring.go:1057)。真正卡住的是那一格数字的 画法 —— 它用 requestAnimationFrame 逐帧滚动,而 Chromium 对被遮挡 / 后台的窗口会停掉 帧生产:数字停在旧值,卡多久 = 被遮挡多久,与后台算分无关。全场只有「单位总分」是滚动 显示的,奖牌榜 / 分项成绩 / 实时赛况都是纯文本,所以只有它看起来会延迟。 - 新增 web/src/display/animatedNumber.ts:缓出插值、兜底时长、是否直接对齐抽成纯函数; 进度越界的晚到单帧直接落到目标值(对应「窗口恢复可见瞬间跳到新值」) - AnimatedNumber.vue:加 duration+400ms 的兜底计时器(帧一个都不来也最迟约 1.3s 对齐到 新值);visibilitychange 变可见 / window focus 时立刻对齐,不再补滚一遍过时动画; 卸载时摘掉监听(大屏是长跑窗口) - console/main/index.js:主进程在 app ready 之前追加 disable-backgrounding-occluded-windows / disable-renderer-backgrounding; 两个 Console 窗口补 backgroundThrottling: false,与大屏窗口同口径 - web/src/shared/realtime.ts:requestResync() 冷却期内排队而不是丢弃 —— 原先丢掉之后 本地版本已经推进,心跳的 data.version > currentVersion 再也发现不了缺口, 那一版该做的重拉会永久缺失 测试 +11 例(display 9 / shared 2),含「命令行开关必须位于 app.whenReady() 之前」的位置断言。 四套自检 ×2 全绿(finalcheck_0513.log:前端 985 例 / Console 96 例 / 服务端 14 包,EXIT=0)。 无数据库迁移;已有成绩、名次、积分、榜单与导出件一个数字都不变。 文档:docs/升级说明.md 新增 dev_0.5.13 一节;docs/常见问题.md 新增 Q103。
This commit is contained in:
1 parent
b29b2b390a
commit
19e5630b39
13 files changed
+401
-26
No files matched your search
Binary file not shown.
|
Before Width: | Height: | Size: 309 KiB After Width: | Height: | Size: 309 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 1.2 MiB After Width: | Height: | Size: 1.2 MiB |
@@ -1 +1 @@
|
||||
0.5.12
|
||||
0.5.13
|
||||
+16
-2
@@ -23,6 +23,14 @@ const { createTrayIcon } = require('./tray-icon')
|
||||
const { isAutostartEnabled, setAutostart } = require('./autostart')
|
||||
const { validateAccountField, buildPasswdArgs, runPasswd } = require('./account')
|
||||
|
||||
// 大屏常年挂在扩展屏上,窗口一旦被别的窗口盖住、或那块屏的输入源被切走,Chromium 会按
|
||||
// 「被遮挡 / 后台」处理并停掉该窗口的帧生产:requestAnimationFrame 回调不再到来,大屏上的
|
||||
// 数字动画就卡在旧值上(数据其实早就更新了,只是画不出来,一卡就是几十秒)。
|
||||
// 这两个开关关掉渲染进程的后台/遮挡节流,让帧回调继续产生,动画才能按时走完。
|
||||
// 必须在 app.whenReady() 之前追加,ready 之后再 appendSwitch 就不生效了。
|
||||
app.commandLine.appendSwitch('disable-backgrounding-occluded-windows')
|
||||
app.commandLine.appendSwitch('disable-renderer-backgrounding')
|
||||
|
||||
// 现场只允许一个实例:两个 Console 会互相抢同一个服务端端口和同一块大屏
|
||||
if (!app.requestSingleInstanceLock()) {
|
||||
app.quit()
|
||||
@@ -144,7 +152,10 @@ function main() {
|
||||
preload: path.join(__dirname, '..', 'renderer', 'preload.js'),
|
||||
contextIsolation: true,
|
||||
nodeIntegration: false,
|
||||
sandbox: true
|
||||
sandbox: true,
|
||||
// 与大屏窗口(displays.js)同口径:窗口被盖住或最小化时不要节流渲染进程,
|
||||
// 否则回到前台要等一拍界面才更新(状态、日志、大屏实例看板都画在这一层)
|
||||
backgroundThrottling: false
|
||||
}
|
||||
})
|
||||
|
||||
@@ -251,7 +262,10 @@ function main() {
|
||||
preload: path.join(__dirname, '..', 'renderer', 'shell-preload.js'),
|
||||
contextIsolation: true,
|
||||
nodeIntegration: false,
|
||||
sandbox: true
|
||||
sandbox: true,
|
||||
// 与大屏窗口(displays.js)同口径:窗口被盖住或最小化时不要节流渲染进程,
|
||||
// 否则回到前台要等一拍界面才更新(服务端管理面板的轮询与刷新都画在这一层)
|
||||
backgroundThrottling: false
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"name": "scoreboard-console",
|
||||
"productName": "Scoreboard Console",
|
||||
"version": "0.5.12",
|
||||
"version": "0.5.13",
|
||||
"private": true,
|
||||
"author": "AskaEth",
|
||||
"description": "赛事积分榜 · 桌面宿主:守护 Go 服务端并把大屏投到扩展屏",
|
||||
|
||||
Reference in new issue
Block a user