Files
SpineWallpaper/.scratch/wallpaper-optimization/issues/02-audio-and-image-size.md
T
Shuery a391021041 perf: 体积从 105.1 MB 降到 28.9 MB(音频转 Opus、图片无损 WebP)
- 两首 flac 母带移入 masters/(gitignore,不入库),转 Opus 128k VBR:3.35 + 3.16 MB
- xilian 三张真 PNG RGBA → 无损 WebP(3.39→1.80、5.01→2.83、3.38→1.76 MB)
- kv37_xilian.png → 无损 WebP 5.13→2.75 MB
- kv37 五张图本来就是 WebP(扩展名误写成 .png),本次只改名并把 atlas 页名改为 .webp
- 删除死文件 dist/jsconfig.json
- 新增 tools/rawdiff.mjs(区分可见差异与仅透明下差异)、tools/atlas-pages.mjs

验证:check-paths 11/11;0 个非 favicon 的 404;无损 WebP 可见像素 0 差异;
libwebp 会改写完全透明像素下的 RGB(xilian 三图 32-49% 像素),渲染级对拍
与 PNG 版相差 0.052/255、热力图全空,确认未因 Linear 过滤渗色。
2026-09-19 19:41:41 +08:00

2.7 KiB
Raw Blame History

02 体积:音频转码 + 未引用资源归位

Status: resolved

现状

  • dist 合计 105.1 MB,其中音频占 77.3 MB:
    • 昔涟立绘/audios/「再度和你」.flac 37.3 MB / 205.1 s / 1.52 Mbps
    • 昔涟立绘/audios/昔涟.flac 37.7 MB / 186.7 s / 1.69 Mbps(此前零引用,现已声明为第二音源)
    • 「成为昨日的明天」/audios/pv37.mp3 2.3 MB / 81 s
  • CEF 的解码白名单含 vorbis / libopus / flac / mp3 / pcm_*(不含 aac,m4a 大概率不可用)。

步骤

  1. 无损母带移出 dist/,存到 masters/(已 gitignore,不入库)。
  2. 两首 flac 转 Opus(libopus 128k VBR)。保留 pv37.mp3 原样。
  3. 核对转码未截断、无解码错误。
  4. 图片转码仅在对拍证明无可见差异后决定(atlas 页要整组转,并同步改 .atlas 里的页名)。

验收

  • dist 总体积 ≤35 MB。
  • check-paths 全绿;转码后的音频可完整解码。
  • 每个比例的对拍像素无回归。

结果

dist 105.1 MB → 28.92 MB。

  • 音频:再度和你.ogg 3.35 MB、昔涟.ogg 3.16 MB,均通过完整解码与电平检查。 昔涟.flac 源文件末尾一帧损坏(186.671 s 处 invalid frame header),但全长音频都在。
  • 图片:全部走无损 WebP(放弃有损路线,因为目标已达成,没必要冒险)。
    • xilian 三张真 PNG RGBA → 无损 WebP:3.39→1.80、5.01→2.83、3.38→1.76 MB
    • kv37_xilian.png → 无损 WebP 5.13→2.75 MB
    • kv37 的五张图本来就是 WebP,只是扩展名写成 .png,本次只改名——这也顺带证明 WebP 在本机 WE 环境可用(线上版本一直在用)
    • atlas 页名同步改为 .webp(tools/atlas-pages.mjs;注意这两个 .atlas 是 CRLF 行尾)
  • 删除死文件 dist/jsconfig.json;README.txt 是 Workshop 描述(BBcode),保留。

验证

  • check-paths:11/11 声明路径存在。
  • 浏览器:0 个非 favicon 的 404。
  • 无损 WebP 与源 PNG 的可见像素 0 差异。libwebp 会改写完全透明像素下的 RGB (tools/rawdiff.mjs 证实 xilian 三张图有 32–49% 像素属此类),而本项目贴图是 Linear 过滤、 透明像素 RGB 会渗进边缘,所以额外做了渲染级对拍:与 PNG 版同冻结设置相比 0.052/255、热力图全空,确认无渗色。
  • 全尺寸矩阵留档于 tools/shots/step02/。

教训

先验证再删除。中途 -preset default 让无损编码退化成有损(产物只剩 0.03–0.54 MB), 而源 PNG 当时已被删除;只因为源都在 git 里(09ff322)才得以还原。 另外 -quality 在这个 ffmpeg 的 libwebp 封装里被忽略,要用 -q:v;-exact 选项不存在。