refactor: 资源按 游戏/壁纸 分层,预设拆进各自壁纸目录
- assets/<游戏>/<壁纸>/{effects,images,audios}/,每档壁纸自包含
- 每档壁纸自带 preset.js:用 import.meta.url 推导自身资源路径,目录可整体搬走;
目录名用显示名(含「」),代码键用稳定 id(xilian/kv37,与 WE 属性值绑定)
- preset-store.js -> presets.js:静态 import 两份预设并建 id 索引
- 新增 CONTEXT.md 术语表与 ADR-0001/0002
- 新增 check-paths / compare / heatmap 三个验证工具;serve.mjs 改为每帧强制动画相位归零
验证:check-paths 11/11 路径存在(含此前零引用的 昔涟.flac);浏览器 0 个真实 404;
与基线 worktree 同冻结设置对拍,9 对跨版本比较中 4 对逐像素完全相同(差异 0),
其余 ≤0.19/255,远低于基线自身的双模态抖动(2.27/255)。
This commit is contained in:
1 parent
399f99edd7
commit
09ff322fe8
29 files changed
+388
-127
No files matched your search
@@ -0,0 +1,47 @@
|
||||
// 把两张图的差异降采样成 ASCII 热力图,好在纯文本里看出"差异落在画面哪里"。
|
||||
// 用法:node tools/heatmap.mjs <a.png> <b.png> [cols] [rows]
|
||||
|
||||
import { spawn } from "node:child_process";
|
||||
|
||||
const [a, b, cols = "48", rows = "20"] = process.argv.slice(2);
|
||||
if (!a || !b) {
|
||||
console.error("usage: node tools/heatmap.mjs <a.png> <b.png> [cols] [rows]");
|
||||
process.exit(2);
|
||||
}
|
||||
|
||||
const W = Number(cols);
|
||||
const H = Number(rows);
|
||||
const RAMP = " .:-=+*#%@";
|
||||
|
||||
const buf = await new Promise((resolve) => {
|
||||
const p = spawn(
|
||||
"ffmpeg",
|
||||
[
|
||||
"-hide_banner", "-loglevel", "error",
|
||||
"-i", a, "-i", b,
|
||||
"-lavfi", `blend=all_mode=difference,format=gray,scale=${W}:${H}:flags=area`,
|
||||
"-f", "rawvideo", "-pix_fmt", "gray", "-",
|
||||
],
|
||||
{ stdio: ["ignore", "pipe", "pipe"] },
|
||||
);
|
||||
const chunks = [];
|
||||
p.stdout.on("data", (d) => chunks.push(d));
|
||||
p.on("close", () => resolve(Buffer.concat(chunks)));
|
||||
});
|
||||
|
||||
if (buf.length < W * H) {
|
||||
console.error(`ffmpeg 只返回 ${buf.length} 字节,期望 ${W * H}`);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
console.log(`${a} vs ${b} (${W}x${H} 降采样,越亮=差异越大)`);
|
||||
console.log(" +" + "-".repeat(W) + "+");
|
||||
for (let y = 0; y < H; y++) {
|
||||
let line = "";
|
||||
for (let x = 0; x < W; x++) {
|
||||
const v = buf[y * W + x];
|
||||
line += RAMP[Math.min(RAMP.length - 1, Math.round((v / 255) * (RAMP.length - 1) * 2))];
|
||||
}
|
||||
console.log(String(y).padStart(3) + " |" + line + "|");
|
||||
}
|
||||
console.log(" +" + "-".repeat(W) + "+");
|
||||
Reference in new issue
Block a user