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
@@ -84,6 +84,16 @@ const DRIVER = (q) => `<script>
|
||||
var origDraw = proto.drawFrame;
|
||||
proto.drawFrame = function () {
|
||||
state.drawCalls = (state.drawCalls || 0) + 1;
|
||||
// 冻结只做一次是不够的:相位可能在成功回调前后被推进过一帧。这里每帧都强制归零,
|
||||
// 保证"同一份代码的任何两次截图"是同一相位,对拍才有意义。
|
||||
if (freeze) {
|
||||
try {
|
||||
var cur = this.animationState && this.animationState.getCurrent(0);
|
||||
if (cur) cur.trackTime = 0;
|
||||
if (this.skeleton) this.skeleton.updateWorldTransform(2);
|
||||
this.viewportTransitionStart = performance.now() - 1e6;
|
||||
} catch (e) { state.error = "freeze-frame: " + e; }
|
||||
}
|
||||
return origDraw.apply(this, arguments);
|
||||
};
|
||||
}
|
||||
@@ -94,6 +104,9 @@ const DRIVER = (q) => `<script>
|
||||
var cur = p.animationState && p.animationState.getCurrent(0);
|
||||
if (cur) cur.trackTime = 0;
|
||||
if (p.skeleton) p.skeleton.updateWorldTransform(2);
|
||||
// 视口过渡(transitionTime 默认 0.25s)是时间相关的插值,会把"冻结"变得不彻底:
|
||||
// 把它推到足够久以前,transitionAlpha >= 1,直接使用 currentViewport。
|
||||
p.viewportTransitionStart = performance.now() - 1e6;
|
||||
state.info = {
|
||||
animations: p.skeleton ? p.skeleton.data.animations.map(function (a) { return a.name; }) : [],
|
||||
skin: p.skeleton ? p.skeleton.data.skins.map(function (s) { return s.name; }) : [],
|
||||
|
||||
Reference in new issue
Block a user