You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
AdLike2048/docs/方案-工作台性能隔离.md

68 lines
3.0 KiB

# 方案:工作台性能隔离(全功能保留)
> 日期: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`**(放入 `<template>`,仅 `?pw=game` 激活)。双引擎会打崩 Electron/Cursor。游戏只在 iframe 内跑;默认同域嵌入。
- 大场景层级序列化仍有成本 → 指纹跳过 + 仅可见时拉取。