Files
frontend-miniapp/docs/QA/h5-model-cache-network-verification-2026-07-02.md

77 lines
3.8 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.
# H5 模型加载缓存 Network 验证记录
日期2026-07-02
## 验证范围
- 项目:`frontend-miniapp`
- 数据源模式:`VITE_DATA_SOURCE_MODE=sdk`
- 渲染方式H5 现有 ThreeMap 本地渲染
- 验证工具Playwright + 本机 Chrome Network 请求监听
- 启动命令:`pnpm dev:h5`
- 访问地址:`http://localhost:5174/``5173` 被占用后由 Vite 自动切换)
本次验证未启用 SGS SDK iframe 渲染SDK 仍只作为数据/API 来源。
## 操作路径
1. 首次进入馆内 3D加载默认全楼/外观模型。
2. 点击“馆内”进入默认 1F 单楼层模型。
3. 从单楼层切换到多楼层。
4. 再切回 1F 单楼层。
5. 打开搜索页,选择“服务台”结果,进入设施详情并触发点位 focus。
6. 离开到“讲解”tab再回到“馆内”地图。
## 问题复现
`GuideModelLoadManager` 默认 `maxEntries=4` 时,单层进入后再切换多层,已加载过的模型会被 LRU 提前淘汰,导致同一 GLB 再次请求:
| 模型 | 切多层前请求次数 | 切多层后请求次数 |
| --- | ---: | ---: |
| `L1_draco.glb` | 1 | 2 |
| `L1.5_draco.glb` | 1 | 2 |
| `L-1_draco.glb` | 1 | 2 |
根因分类LRU source cache 容量过小。当前 SDK 数据包含 8 个可导览楼层,多层加载会顺序触达多个 GLB`maxEntries=4` 无法覆盖单层、相邻预加载、多层展开和全楼模型的运行期复用需求。
## 修复
已在 `src/services/model/GuideModelLoadManager.ts` 将默认 source cache 容量调整为 `10`,用于覆盖:
- 当前 8 个可导览楼层模型;
- 全楼/外观模型;
- 相邻楼层预加载余量。
`ThreeMap.vue` 普通 `onUnmounted` / `disposeScene` 未调用 `guideModelLoadManager.clearAll()`,运行期组件重建不会清空全局 source cache。
## 修复后 Network 统计
修复后重新执行同一路径,关键 GLB 请求次数如下:
| 模型 URL | 进入单层后 | 切多层后 | 切回单层后 | 点位/详情 focus 后 | 讲解 tab 返回馆内后 |
| --- | ---: | ---: | ---: | ---: | ---: |
| `/museum-assets/optimized/20260617/draco_EXTERIOR.glb_1781708354536.glb` | 1 | 1 | 1 | 1 | 1 |
| `/app-api/gis/sdk/minio/museum-assets/sgs-map/glb/1/V20260627093736_e73e3/models/L1_draco.glb` | 1 | 1 | 1 | 1 | 1 |
| `/app-api/gis/sdk/minio/museum-assets/sgs-map/glb/1/V20260627093736_e73e3/models/L1.5_draco.glb` | 1 | 1 | 1 | 1 | 1 |
| `/app-api/gis/sdk/minio/museum-assets/sgs-map/glb/1/V20260627093736_e73e3/models/L-1_draco.glb` | 1 | 1 | 1 | 1 | 1 |
| `/app-api/gis/sdk/minio/museum-assets/sgs-map/glb/1/V20260627093736_e73e3/models/L5_draco.glb` | 0 | 1 | 1 | 1 | 1 |
| `/app-api/gis/sdk/minio/museum-assets/sgs-map/glb/1/V20260627093736_e73e3/models/L4_draco.glb` | 0 | 1 | 1 | 1 | 1 |
| `/app-api/gis/sdk/minio/museum-assets/sgs-map/glb/1/V20260627093736_e73e3/models/L3_draco.glb` | 0 | 1 | 1 | 1 | 1 |
| `/app-api/gis/sdk/minio/museum-assets/sgs-map/glb/1/V20260627093736_e73e3/models/L2_draco.glb` | 0 | 1 | 1 | 1 | 1 |
| `/app-api/gis/sdk/minio/museum-assets/sgs-map/glb/1/V20260627093736_e73e3/models/L-2_draco.glb` | 0 | 1 | 1 | 1 | 1 |
结论:同一个实际 GLB 在运行期全局缓存有效范围内不再重复发起网络请求。
## 质量验证
- `pnpm type-check`:通过
- `pnpm lint`:通过
- `pnpm build:h5`:通过,仅有既有 Sass deprecation warnings
## 剩余风险
- 运行期内存缓存无法跨页面刷新;刷新页面后重新请求 GLB 属于预期行为。
- `maxEntries=10` 会比 `4` 保留更多 GLB source移动端内存需在真机上继续观察。
- 如果 `/app-api/gis/sdk/minio/...` 或后端 `/gis/sdk/minio` 偶发 500仍需继续排查 `smart-navigation-system` 的 MinIO 代理层。
- 本轮未新增 Service Worker / Cache-Control 持久缓存策略;如需跨刷新复用,应作为后续专项处理。