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

117 lines
5.5 KiB

# 方案:预览调试工作台(零侵入)
> 日期:2026-10-14
> 范围:仅 `preview-template/`,不修改 `assets/**`,可拷贝到任意 Creator 3.8 项目。
## 1. 目标
浏览器预览中的运行时分析坞:可调布局、层级/属性(含点选与实时改值)、官方性能浮窗 + 历史曲线、资源缓存与内存估算、控制台。
**不做**:Prefab 编辑、序列化落盘、编辑器级 Inspector、项目内埋点。
## 2. 硬约束
- 零侵入:不新增/修改业务 TS;不要求项目调用 `mark()`。
- 全部代码在 `preview-template/index.ejs` + `preview-template/workbench/**`。
- 运行时只访问预览页引擎全局(`cc`);在 `<%- include(cocosTemplate) %>` 之后加载并等待就绪。
- 可选软接口:`window.__PreviewWorkbench.mark(label)`(项目可不调用)。
## 3. 业务标记(模板侧)
| 来源 | 文案示例 | 实现 |
|------|----------|------|
| 场景启动/改名 | `scene:Main` | `Director.EVENT_AFTER_SCENE_LAUNCH` + 轮询 scene.name |
| 前后台 | `game:hide/show` | `Game.EVENT_HIDE/SHOW` |
| Bundle 新出现 | `bundle:xxx` | 轮询 `assetManager.bundles` diff |
| 资源跳变 | `assets:+N` | 计数增幅超阈值(可关) |
| 用户手动 | `user:…` | 性能面板按钮 |
无「大厅/战斗」等玩法语义;自愿 `mark('battle')` 可显示自定义标签。
## 4. 架构
```
preview-template/
index.ejs
workbench/
css/workbench.css
3 days ago
js/
host.js # 等 cc、挂 __PreviewWorkbench
bridge.js # 壳侧 postMessage / 同域直调
layout-core.js # 布局生命周期 / 停靠树重建 / 工具栏 / 持久化
layout-presets.js # 分析/场景/精简预设树
layout-render.js # split/tabs/game 渲染与分割条
layout-dock.js # 面板拖拽停靠
layout-tree.js # 停靠树查找/清理/拆分
layout-float.js # 悬浮窗与面板开关记忆
markers.js
perf-sampler.js
charts/ring-chart.js
panels/perf.js
panels/assets.js
panels/hierarchy.js
panels/inspector.js
panels/console.js
pick.js
```
游戏侧探针(`?pw=game`,见「方案-工作台性能隔离」):
```
workbench/js/
agent-util.js # 节点遍历/序列化/指纹公共函数
agent-core.js # 探针构造、RPC、订阅、资源/游戏控制
agent-serialize.js # Inspector 属性读写
agent-pick.js # 画布点选与高亮
agent-console.js # console 钩子与格式化
agent.js # 启动入口(创建 __PW_Agent)
device.js / idle.js / perf-sampler.js / markers.js
```
## 5. 布局
- 隐藏官方预览工具栏,使用自研菜单(设备 / 旋转 / 帧率 / 暂停 / 游戏·检视 / 面板开关)。
- 设备选择后预览区显示手机边框(刘海可选),按逻辑分辨率缩放适配。
- **Desktop 停靠树(接近 Creator)**:
- 拖到区域**标题栏/中心** = 合并为同一区域页签
- 拖到区域**边沿** = 在该方向新建布局区域(递归拆分)
- 横排含游戏时,上/下边沿只包住**连续非游戏列**(例如层级|属性下方),不横跨游戏区;竖排含游戏时左/右同理
3 days ago
- 分割条拖拽改比例;`localStorage` 键 `preview-workbench-layout-v7`
- **默认分析布局**:竖屏 → 左上层级|属性、左下控制台(横跨两列)、中游戏、右性能;横屏 → 上层级|属性|游戏|性能、下控制台通栏
- **设备预览**:设备框仅为容器(按可用区域与设备宽高比算出真实布局尺寸,**禁止** `transform: scale`);游戏画布 100% 铺满容器;`setFrameSize` = 容器 client 尺寸,触摸坐标与画面一致
- **Compact**:游戏最大化;面板互斥抽屉;底栏切换。
### 原型(Desktop 分析)
```
┌─ 官方 Toolbar ──────────────────────────────────────────┐
├─ WB: [Game|Inspect] [布局] [浮窗] [层级][属性][资源][性能][控制台]
├─ Hierarchy │ GameCanvas │ Inspector ─┤
├────────────┴─────────────────────┴────────────┤
│ BOTTOM Perf Viz(曲线 + 自动/手动标记纵线) │
└────────────────────────────────────────────────┘
```
## 6. 面板要点
- **性能**:`profiler.showStats` 浮窗 + `PerfSampler` 环缓冲多曲线;暂停/清空/导出 CSV/打标记。
- **资源**:仅 `assetManager`;按 Bundle/类型筛选排序;估算内存(不能算则 `n/a`);GFX 总量对照;预览缩略图。
- **层级/属性**:运行时树;可写 transform/active 等;`Game`/`Inspect` 切换;Inspect 下画布点选 + 高亮。
- **控制台**:钩子 `console.*` 环缓冲。
## 7. 分期与验收
| 阶段 | 验收 |
|------|------|
| P0 | PC 拖拽布局持久化;手机抽屉;横竖屏画布正常;cc 就绪提示 |
| P1 | 浮窗与曲线同源;自动 scene/bundle 标记;导出 CSV |
| P2 | 分类/分包/排序/估算/预览 |
| P3 | 点选高亮;改属性实时生效 |
| P4 | 级别过滤控制台 |
## 8. 风险
- 全局名以预览注入为准,失败提示「引擎未就绪」。
- 单资源 GPU 内存为估算,与 `textureMemory` 总量可能不一致,UI 并排标注。
- Inspect 临时高亮须在退出/卸载时销毁。