# 方案:工作台性能隔离(全功能保留) > 日期:2026-10-14 > 范围:仅 `preview-template/` + 本文档 ## 1. 目标 在保留层级 / 属性 / 点选 / 性能 / 资源 / 控制台 / 设备框等全部能力的前提下,让游戏主线程**默认接近零开销**,并支持一键「纯净测帧」。 同页同线程无法做到严格 0 影响;本方案用三层隔离逼近: 1. **结构**:壳 document ↔ 游戏 iframe(可跨域争取进程隔离) 2. **行为**:游戏内 Agent 默认休眠,按面板订阅激活 3. **测帧**:`纯净测帧` → `hibernate()` 清空全部探针 ## 2. 入口模式 | URL | 角色 | |-----|------| | `/` 或无 `pw` | **壳**:停靠布局 + 面板 + Bridge;中央 iframe 加载游戏 | | `?pw=game` | **游戏**:引擎 + 设备框 + Agent(无工作台 DOM) | 跨域策略:壳在 `localhost` 时,iframe 优先 `127.0.0.1`(互为不同 origin)。约 5s 未就绪或 `agent.ready` 失败则写入 `sessionStorage.pw-cross-fail=1` 并**同域降级**。 ## 3. 文件 ``` preview-template/ index.ejs # data-pw=shell|game 双模式 workbench/js/ agent-util.js # 游戏侧公共:walk / findNodeByUuid / serializeNode / fingerprint agent-core.js # 游戏探针 RPC + 订阅生命周期 agent-serialize.js # 属性 Inspector 序列化/写回 agent-pick.js # 画布点选 agent-console.js # console 钩子与格式化 agent.js # 启动入口(先挂 __PW_Agent 再 boot) bridge.js # 壳侧 postMessage / 同域快路径 idle.js # requestIdleCallback 2ms 切片(run 可续跑) host.js # 仅壳:布局 + 订阅同步 layout-*.js # 仅壳:core/presets/render/dock/tree/float panels/* # 仅壳:不直接碰 cc ``` ## 4. 订阅与休眠 | 通道 | 激活条件 | 行为 | |------|----------|------| | `perf` | 性能面板可见 | 采样(默认 500ms),壳侧 200ms 合并绘曲线 | | `markers` | 随 perf | scene/bundle 轮询 | | `hierarchy` | 层级可见 | 指纹变化才推树 | | `inspector` | 属性可见 | 按需 `node.get/set` | | `assets` | 资源可见 | idle 切片枚举 | | `console` | 控制台可见 | hook + 100ms 合批 | | `pick` | 检视模式 | 点选;选中后 ≤10fps 推 AABB | 默认:无 interval、无 console hook、无 rAF、不 `showStats`。 ## 5. 验收 - 默认打开壳、不点面板:游戏 iframe 内 Agent 无定时器;开「纯净测帧」后帧耗时接近裸预览。 - 只开性能 / 层级 / 控制台:仅对应通道有流量;关闭即停。 - 跨域失败自动同域,功能仍可用。 ## 6. 风险 - Creator 预览可能只监听单一 host → 跨域失败属预期,走同域降级。 - **壳页禁止执行 `cocosTemplate`**(放入 `