现场:清空本组后,大屏上的「单位总分」要等几十秒才降下来。 根因不在「清空」这条路:服务端在同一个事务里就把流水作废重写、算出整张榜单并推送, 与「撤销发布」逐条同构(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。
88 lines
2.0 KiB
JSON
88 lines
2.0 KiB
JSON
{
|
|
"name": "scoreboard-console",
|
|
"productName": "Scoreboard Console",
|
|
"version": "0.5.13",
|
|
"private": true,
|
|
"author": "AskaEth",
|
|
"description": "赛事积分榜 · 桌面宿主:守护 Go 服务端并把大屏投到扩展屏",
|
|
"main": "main/index.js",
|
|
"scripts": {
|
|
"start": "electron .",
|
|
"check": "node scripts/check-syntax.js",
|
|
"dist": "electron-builder --win --x64",
|
|
"pack": "electron-builder --dir"
|
|
},
|
|
"devDependencies": {
|
|
"electron": "^38.0.0",
|
|
"electron-builder": "^26.0.12"
|
|
},
|
|
"build": {
|
|
"appId": "top.yeij.scoreboard.console",
|
|
"productName": "Scoreboard Console",
|
|
"directories": {
|
|
"output": "../dist/console",
|
|
"buildResources": "resources"
|
|
},
|
|
"files": [
|
|
"main/**/*",
|
|
"renderer/**/*",
|
|
"config.json",
|
|
"package.json"
|
|
],
|
|
"extraFiles": [
|
|
{
|
|
"from": "../dist/scoreboard.exe",
|
|
"to": "scoreboard.exe",
|
|
"filter": ["**/*"]
|
|
},
|
|
{
|
|
"from": "../config.yaml",
|
|
"to": "config.yaml"
|
|
},
|
|
{
|
|
"from": "config.json",
|
|
"to": "config.json"
|
|
},
|
|
{
|
|
"from": "scoreboard.png",
|
|
"to": "scoreboard.png"
|
|
},
|
|
{
|
|
"from": "../rules",
|
|
"to": "rules"
|
|
},
|
|
{
|
|
"from": "extra",
|
|
"to": ".",
|
|
"filter": ["**/*", "!.gitkeep"]
|
|
}
|
|
],
|
|
"win": {
|
|
"executableName": "Scoreboard_Console",
|
|
"icon": "resources/icon.ico",
|
|
"target": [
|
|
{
|
|
"target": "nsis",
|
|
"arch": ["x64"]
|
|
},
|
|
{
|
|
"target": "zip",
|
|
"arch": ["x64"]
|
|
}
|
|
],
|
|
"artifactName": "${productName}-${version}-${arch}.${ext}"
|
|
},
|
|
"nsis": {
|
|
"script": "installer/installer.nsi",
|
|
"oneClick": false,
|
|
"allowToChangeInstallationDirectory": true,
|
|
"createDesktopShortcut": true,
|
|
"shortcutName": "赛事积分榜",
|
|
"license": "../LICENSE",
|
|
"include": "resources/installer-custom.nsh",
|
|
"selectPerMachineByDefault": true,
|
|
"language": "2052"
|
|
}
|
|
}
|
|
}
|