Improve Cesium cruise smoothness

This commit is contained in:
2026-08-03 15:17:51 +08:00
parent a824bee69b
commit 0d2dc2228c
10 changed files with 224 additions and 13 deletions

View File

@@ -121,6 +121,26 @@ catalog.MATERIALS 声明「是什么」 纯 Python无 bpy
**这类"试过、不行、为什么"的记录要保留。** 删掉它,下一个人会重新引入同一个资产。
## 灌木边缘实例有性能预算
`generate_scene.py` 的 scrub 不是只有贴地面:`natural=scrub` 会先生成
`Scrub_<way_id>` 地面覆盖,再沿边界实例化 `assets/models/custom/bush/bush.glb`
`add_scrub_edge_bushes()`),并在大 scrub 面内部稀疏补树。
这些 bush 是共享 mesh 的多 node 实例。共享 mesh 能压 GLB 体积,但 Cesium 近景 Follow
仍要处理每个 node / draw。`nantaizi-lake-innovation-valley` 曾经用
`SCRUB_BUSH_SPACING = 0.82``SCRUB_BUSH_LIMIT_PER_PATCH = 180`,结果一个场景有约
`707` 个 bush nodes车辆 Follow 到灌木密集区域时明显卡顿。当前预算是:
```python
SCRUB_BUSH_SPACING = 1.8
SCRUB_BUSH_LIMIT_PER_PATCH = 60
```
在 nantaizi 上约 `266` 个 bush nodesscrub 地面覆盖仍保留。不要只为了“更满”把间距
调回 1m 以下;那是在把预览流畅度换成近景装饰密度。若确实需要更密的灌木,先换低模
bush 或做显式 LOD / instancing 方案,再跑 Cesium preview 验证。
---
## 确定性:用无理数周期代替 RNG

View File

@@ -162,6 +162,21 @@ let baseStatus = "";
相机相关的读数必须跟着渲染循环刷新并**做节流**。用 `setInterval` 会在相机快速移动时
读到过期值,不节流会拖慢帧率。
### 车辆巡航热路径要少分配
车辆巡航是预览层里唯一持续动画的功能。`scripts/lib/cesium-preview.js`
`routeOrientation()``createChaseFollow()` 每帧都会运行,里面的 `JulianDate`
`HeadingPitchRoll``Quaternion``Matrix4` 等临时对象必须在闭包外复用,不要在
`CallbackProperty``viewer.clock.onTick` 回调里 `new`
预览页面加载的是 30MB+ GLB动画时 GPU 已经很忙;巡航辅助线也要避免额外透明合成。
路线 polyline 使用不透明 `Color``arcType: Cesium.ArcType.NONE`,不要为了视觉效果
随手改回半透明 geodesic 线。
不要默认降低 `viewer.resolutionScale` 或关闭 antialias/MSAA 来换取巡航流畅度。
这会让用户误判材质和模型质量。若确实需要性能模式,应做成显式开关,而不是默认牺牲
预览清晰度。
### 单资产 vs 多资产的开关
```js
@@ -207,6 +222,9 @@ python3 -m http.server 8765
| 用定时器代替 `waitForStableFrames` | 遮罩在材质编译完成前就收起,画面是花的 |
| 相机读数用 `setInterval` | 快速移动时读到过期值 |
| 诊断刷新不节流 | 拖慢帧率 |
| 在车辆每帧回调里创建 `JulianDate` / HPR / 矩阵对象 | 巡航时触发 GC 抖动 |
| 默认打开半透明路线辅助线 | 增加透明合成成本,主场景可见时车辆更不顺 |
| 默认降低 `resolutionScale` 或关抗锯齿 | 预览变糊,无法判断材质/模型质量 |
| 再开一个全局变量 | 已有 `window.osmPreview` |
| 用 `file://` 打开 | fetch 被拦,卡在加载中 |