[P0][CR-F4] 投射物图集加载失败被静默吞掉,渲染退化为代码绘制的色块或借用别的图 #530
Loading…
Reference in New Issue
No description provided.
Delete Branch "%!s(<nil>)"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
问题描述
投射物、爆炸、施法特效的图集加载失败时,既没有日志,也没有提示。渲染层随后会用代码绘制的色块代替,或者借用另一个投射物的图。
结果是:美术资源缺失或打包出错时,画面上仍然"有东西",看起来像是能跑,问题很难被发现。这同时违反了
AGENTS.md的两条规则:证据
1. 加载失败被吞掉
void promise.then(...),没有任何.catch:act-scene.ts:191-201。三个加载分别是:loadMissileArtMaploadItemsAtlasloadOverlayArtMaploadMissileArtMap内部依次尝试多个候选路径:catch { // ignore candidate error ... }吞掉(missile-overlay-renderer.ts:95-97);2. 缺图时退化为代码绘制或借图
投射物:在 world-renderer.ts:874-887 里:
renderer.drawSolid(... [0.9, 0.9, 0.2, 1]));undefined,走程序化绘制。drawMissileProjectile的缺图分支:从 missile-overlay-renderer.ts:275 起,没有图集时用drawSolid拼出程序化图形,例如:这个文件里共有 31 处
drawSolid。爆炸:
fireexplode的图:world-renderer.ts:893-901;fireexplode也没有时,drawExplosion用drawSolid画一个程序化的火球:missile-overlay-renderer.ts:451-464。手写的借图表:world-renderer 里还有一张手写的别名表:
frozenorbbolt/frozenorbnova→iceboltblizzard4→blizzard3blizzardexplode3→blizzardexplode2lightningstrike/chainlightning对照 Missiles.txt,这几组在
CelFile上确实相同,比如frozenorbbolt和icebolt都是 IceBolt,chainlightning和lightningstrike都是 LightningStrike,所以借用本身没错。但这种对应关系应该在打包时由CelFile推导出来,而不是在渲染代码里手写。而且表里的'lightning'在 Missiles.txt 中并没有这一行。根因
AGENTS.md§4.1 要求两者全链路对齐)。修复指南
loadMissileArtMap/loadOverlayArtMap/loadItemsAtlas收集每个失败项的名字、候选路径和原因(HTTP 状态或异常);console.error一次,并在状态栏提示"N 个投射物图集缺失";void ...then()补上.catch,走统一的错误上报;import.meta.env.DEV)下直接 fail-fast,抛出带缺失清单的错误。drawMissileProjectile和drawExplosion中的程序化缺图分支,以及"借用fireexplode"的兜底;CelFile本来就是空值(例如lightningbolt),说明原版由客户端特殊绘制。这类情况按 1.13c 的客户端逻辑实现,并注明出处,不算缺图。scripts/pack-missiles.ts按CelFile烘焙图集;CelFile非空的行;CelFile非空的投射物做校验:文件在 MPQ 中存在,并且烘焙成功,否则让打包失败;验收标准
firebolt的 json 改名)后:console.error,状态栏有提示。world-renderer.ts和missile-overlay-renderer.ts中不再有投射物、爆炸的drawSolid缺图分支和手写别名表。CelFile非空的行都能产出图集或明确报错;新增测试校验映射表覆盖完整。npm run typecheck0 error;npx vitest run全部通过。相关
missiles-meta.ts的生成方式。已在提交
3465c80(fix(render): fail fast on missing missile sprite atlases without fallback art (#530))中完成修复,并在5de27f8中补充端到端与 136 关全量验证套件。修复与验证摘要
.catch(() => {})静默吞错,移除world-renderer.ts与missile-overlay-renderer.ts中的程序化drawSolid色块与借用fireexplode兜底,补齐Missiles.txtCelFile映射并在缺失必需图集时显式 fail-fast 报错。tests/p0-530-missile-art-failfast.test.tsnpm run build0 错误、14 个 P0/E2E 测试套件(190/190 用例)100% 通过、全仓 Vitest 6,460/6,460 通过、136/136 关无头浏览器巡检通过。