Runner v2 全弧第一相(HJ-RUNNER-ARC-001 / P1):用王蓝莓把"上层游戏宿主装载契约"
从零 spike 到"引擎真掌帧 + 游戏美术与引擎粒子同屏可玩",解锁 P2 泛化 / P3 生成。
契约与共享件
- 新增装载契约 game-runtime/src/core/game-host.d.ts(第9类 additive·暂名):
GameHostBootContext / GameInstance / GameHostFactory;游戏=纯模块工厂,零引擎 import,
能力经下层 ctx.getEngine()(受控面 6 项零改),绘制面 render(g) 的 g=引擎 mainContext
- makeEngineCaps 闭包提升为可 import 模块 host-dev/engine-caps.js(createEngineCaps):
host-dev/ref/未来生成游戏共用;engineMode 短路 / __engineCalls 探针 / null-engine 语义逐行不变
王蓝莓 real 通道(games/wanglanmei-ref)
- 增 ?engine=real:主循环从浏览器 RAF 改挂 engineInit 五回调(掌帧唯一源=引擎);
游戏美术绘制面从 #game 改引擎 mainContext(同屏合并);bundle 延后到 setupReal 内以
mainContext 建(getContext2d 闭包快照修);保 ?engine=stub 逐像素确定性回滚
- game-shop.js 抽为独立 GameHostFactory(零引擎 import,P3 生成 agent 可复制范本)
- entry.js 动态 import('littlejsengine')=node-import-safe ∧ esbuild iife 入包两全
- 驱动 e2e-input.cdp.cjs real 改造:禁 stepFrames 手摇(防双掌帧),真触摸+轮询;
门②同屏像素判据(暖色 warmHits ∧ 引擎粒子 brightHits 同张 #game-engine)
真机验收(mini-desktop real 引擎,5 门)
引擎掌帧 dFrame=31∈[20,45] / 同屏 warmHits=682∧brightHits=13028 同张 #game-engine /
particles.spawnEmitter+synthSfx call-ID 运行时真调引擎 / CDP 517 真触摸跑通整局
(第1天接待18·营收¥79.9·连击9) / console 零错;本机 88 单测全绿(含修复 4 红+补回归)
证据:games/wanglanmei-ref/evidence/p1-real/(e2e-evidence.json pass=true + 5 截图肉眼复核)
诚实 caveat:门② brightHits 在结算屏混入亮 UI,同屏合并由 warmHits(美术落引擎画布)+
call-ID(粒子真调引擎)+ 引擎架构(粒子渲同一 mainContext)三证成立,非阻断。
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
3.0 KiB
SIZES.md —— 发行版字节预算实测(增量法,core-protocol-v0)
由
scripts/size.mjs在集成段(mini-desktop)生成。勿手改,改源后重跑覆盖。 口径:esbuildbundle+minify+format=iife+target=es2019+sourcemap=false; gz =zlib.gzipSync(buf,{level:9})(等价gzip -9);增量法 = 基线壳→+core→逐插件叠加,差值为各件净增。
| 叠加项 | 累计 raw | 累计 gz | 增量 raw | 增量 gz | gz 预算 | 判定 |
|---|---|---|---|---|---|---|
| 基线壳 | 0 | 0 | — | — | — | 基准 |
| +core | 9327 | 3387 | 9327 | 3387 | — | — |
| +example | 9871 | 3630 | 544 | 243 | 2048 | ✔ ≤2048 |
| +audio-music | 15944 | 5702 | 6073 | 2072 | 12288 | ✔ ≤12288 |
| +collision | 20797 | 7733 | 4853 | 2031 | 8192 | ✔ ≤8192 |
| +gamefeel | 24714 | 8895 | 3917 | 1162 | 4096 | ✔ ≤4096 |
| +palette-post | 29123 | 10505 | 4409 | 1610 | 8192 | ✔ ≤8192 |
| +particles-juice | 33383 | 12086 | 4260 | 1581 | 10240 | ✔ ≤10240 |
| +physics-lite | 35786 | 13015 | 2403 | 929 | 6144 | ✔ ≤6144 |
| +runtime-probe | 38746 | 14215 | 2960 | 1200 | 6144 | ✔ ≤6144 |
| +save-progress | 42785 | 15487 | 4039 | 1272 | 2048 | ✔ ≤2048 |
合计插件 gz 增量 ≈ 12100B(自律线 60K;超 60K 须创始人显式放行,执行版 §5)。
游戏产物(引擎+包装层)——P1 王蓝莓上引擎口径
口径区别:上表「增量法」量的是插件净增(基线壳→+core→逐插件叠加,不含引擎)。游戏产物(一款 game-shop bundle)= 引擎 + 能力插件库 + 游戏代码 整包,是另一口径,不并入上表。 同一 esbuild 锁参(
bundle+minify+iife+es2019+sourcemap=false);gz=zlib.gzipSync(buf,{level:9})。
| 产物 | 引擎入包 | raw | gz | B1 入场券(gz≤350KB) | 备注 |
|---|---|---|---|---|---|
| ref stub 通道 | 否 | ~197KB | — | ✔ | 不打引擎(回滚锚;引擎 import 经 engineMode 短路不触达运行时,但 esbuild 仍随 entry 引擎 import 打入——故 stub/real 同一份 bundle,差异在运行时通道,不在产物字节) |
| ref real(引擎真入) | 是(littlejsengine.esm.js 640KB 源经 tree-shake+min) |
264KB | 88KB | ✔(gz 88KB ≪ 350KB) | entry.js/main.js import 引擎(Q4:只 entry/host);game-shop.js 游戏工厂零引擎 import(metafile 实证)。grep -q ParticleEmitter 核入包 |
实测来源:6c6g
node scripts/build.mjs games/wanglanmei-ref/entry.js → /tmpdry-build(raw=264476 / gz=89583,2026-06-13)。引擎入包凭据:metafileinputs含node_modules/littlejsengine/dist/littlejs.esm.js,且仅main.js/entry.jsimport 之(Q4)。 注:插件增量法不覆盖游戏产物口径——勿把游戏产物字节并入上表「合计插件 gz 增量」。mini-desktop 可经size.mjs复测覆盖本节。 勿引「13KB / 55KB」自研 Canvas 旧口径(已废,见 [.agents tech-decisions §1.1]);引擎=LittleJS 完整版。