zizi 99b6c82dec feat(runner-v2): P1 王蓝莓上引擎=游戏宿主装载契约 spike 实(mini-desktop real 引擎 5 门全过)
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>
2026-06-13 18:32:50 +00:00

39 lines
3.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# SIZES.md —— 发行版字节预算实测(增量法,core-protocol-v0)
> 由 `scripts/size.mjs` 在集成段(mini-desktop)生成。**勿手改**,改源后重跑覆盖。
> 口径:esbuild `bundle+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 → /tmp` dry-build(raw=264476 / gz=89583,2026-06-13)。引擎入包凭据:metafile `inputs` 含 `node_modules/littlejsengine/dist/littlejs.esm.js`,且仅 `main.js`/`entry.js` import 之(Q4)。
> **注**:插件增量法不覆盖游戏产物口径——勿把游戏产物字节并入上表「合计插件 gz 增量」。mini-desktop 可经 `size.mjs` 复测覆盖本节。
> **勿引「13KB / 55KB」自研 Canvas 旧口径**(已废,见 [.agents tech-decisions §1.1]);引擎=LittleJS 完整版。