Files
SpineWallpaper/.scratch/wallpaper-optimization/spec.md
T
Shuery eb56efbd9e feat: 比例适配、bgm 音源选择与 fps 限流,打包 v3
取景(issue 04)
- 新增 viewport-fitter.js:让立绘层缩放跟随背景图的 cover 缩放——背景放大多少倍、
  特效就放大多少倍。原先背景走 cover、立绘层走 contain,比例一变两者就分叉。
  16:9 下与作者设定逐像素一致(kv37 为 0 差异)。实测证伪了"contain 会裁掉作者视口"
  这个最初的判断:contain 在任何比例下都完整含住作者视口。
- 应用方式为原地改写 config.viewport 字段后调 setViewport(),不重建播放器;
  维护挂在 config.frame 上按画布比例增量进行(config.success 早于 setViewport,拿不到视口)。

WE 属性(issue 05)
- project.json 新增 bgm combo(所有壁纸音源的并集 + 「随预设」);所选项不属于当前壁纸时
  音频回落该壁纸默认,选择本身保留。
- fps 限流包裹实例 drawFrame 并接管排程。修掉两个实测缺陷:朴素丢帧会把 rAF 抖动放大成
  整拍丢失(目标 30fps 实测只有 22.5fps);fps:0 被真值判断吞掉导致无法取消限流。

打包(issue 06)
- project.json version 升至 3 并更新描述;preset 的 combo 取值保持 xilian/kv37 不变。
- preview.gif 821 KB → 347 KB(每 2 帧取 1 帧 + 128 色不抖动,逐帧与源帧像素完全相同)。
- index.html 加内联 favicon,消除 CEF 自动请求 /favicon.ico 造成的 404 报错。

其它
- dist/scripts/wallpaper-engine.js 移到 tools/:它没有任何入口引用,且环境判据依赖真实 WE
  并不存在的 wallpaperRegisterListener,一旦按它自己的说明挂进 index.html 会在生产环境自我激活。
- 修正死文件检查:原检查会拿文件名匹配到文件自身的内容,使这类文件漏网。
- 新增离线算式验证与 resize / 属性 / 全量验收三套浏览器测试脚本。
2026-09-19 20:29:25 +08:00

42 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 优化已发布的网页壁纸(workshopid 3604974793)
在**不重写播放器**的前提下,就地优化现有 `dist/` 作品:资源分层、体积、健壮性、比例适配、属性扩展,最后重新打包发布 v3。
## 背景与约束(已确认)
- 原样入库的基线是 commit `d8c7e49`(105.1 MB),期间不做"顺手重构"。
- 已发布作品,`project.json` 里 combo 选项的 `value`(`xilian` / `kv37`)**不可改**,否则老用户已保存的预设选择会失效。
- 音源与音量是**用户级覆盖**,切换预设不得清掉;接受有损音频,无损母带留在 dist 之外。
- 图片转 WebP 只在 AB 对拍证明肉眼无差别后才做,否则保留 PNG。
- 适配目标:任何比例下主体完整、底部对齐、无空边。
- 验收:0 个死文件;总体积 ≤35 MB;3 种比例干净;0 个 console 报错;预设往返不丢音源设置;连续 20 次切换无内存增长。
## 决策记录
| 主题 | 决定 | 记录位置 |
| --- | --- | --- |
| 资源分层 | `assets/<游戏>/<壁纸>/{effects,images,audios}/`,每档壁纸自包含 | `docs/adr/0001-resource-layout.md` |
| 目录名 vs 键 | 目录名用显示名(含 `「」`),代码键用稳定 id | 同上 |
| 预设形式 | 每档壁纸一份 `preset.js`(ES module + `import.meta.url`) | `docs/adr/0002-preset-as-es-module.md` |
| 术语 | 一档壁纸(Wallpaper)= 用户可见选项;预设(Preset)= 它的配置实体 | `CONTEXT.md` |
| 音源作用域 | combo 列表为全局并集;切壁纸时若当前音源不属于新壁纸,回落"随预设" | 本 spec |
## 验证台(后续每一步都用它)
`tools/serve.mjs` 起本地服务并注入驱动(模拟 WE 下发用户属性、冻结动画相位、藏 canvas 取参考帧),
`tools/cdp.mjs` + `tools/shot.mjs` 走 CDP 真实时间截图,`tools/diff.mjs` / `compare.mjs` / `heatmap.mjs` 做像素差分,
`tools/check-paths.mjs` 静态校验预设里声明的每个路径是否存在。
判定标准:以"与基线逐像素完全相同的对数"和噪声底(约 0.1/255)为准;基线自身存在约 2.3/255 的双模态抖动,不能拿单次差异下结论。
## 步骤
| # | 步骤 | 状态 |
| --- | --- | --- |
| 01 | 资源按 游戏/壁纸 分层,预设拆进各自壁纸目录 | 完成(`09ff322`) |
| 02 | 体积:音频转 Opus + 图片无损 WebP(105.1 → 28.9 MB) | 完成 |
| 03 | 健壮性:初始化状态机、死代码、用户级覆盖语义 | 完成(`4662856`) |
| 04 | 比例适配:立绘层取景跟随背景 cover 缩放 | 完成 |
| 05 | WE 属性扩展:音源 combo、fps 限制 | 完成 |
| 06 | 打包 v3 并重新发布 | 完成(上传为待人工执行) |