先测量再优化:把问题拆成下载、解析、上传 GPU、绘制与业务更新五个阶段。首屏慢不一定是文件大,卡顿也不一定是三角面太多;请求数量、Draw Call、纹理尺寸和频繁对象创建都可能是主因。
先定义可量化的性能目标
优化前应固定测试设备、网络、相机路径和数据版本,至少记录首个可交互时间、首屏清晰时间、稳定帧率、并发请求数、峰值内存与显存占用。没有统一测试条件,调低画质带来的“变快”很难客观判断。

切片树决定加载效率上限
合理的切片树应让节点空间范围均衡、层级连续,并使父级低精度内容能够快速提供整体轮廓。节点过大时,用户只看局部也要下载大量无关数据;节点过碎时,请求、调度和解析成本会超过几何本身。
控制节点大小与内容密度
同一节点内尽量放置空间相近、生命周期一致的对象。大型地面、建筑外壳与高细节设备可以采用不同的切片策略,不必强行进入同一棵均匀树。
正确设置 geometricError
几何误差决定何时细化。数值过大容易近距离模糊,过小则会过早加载深层节点。应结合真实模型尺寸、目标屏幕误差和常用相机高度调试,而不是套用固定值。
选择 ADD 或 REPLACE
REPLACE 适合父子层级表达同一对象的不同精度;ADD 适合子节点在父节点基础上增加细节。错误选择会导致重复几何、闪烁或切换时短暂缺失。
五个阶段分别怎么优化
| 阶段 | 常见瓶颈 | 优化方向 |
|---|---|---|
| 请求 | 小文件过多、带宽竞争 | 并发调度、HTTP/2 或 HTTP/3、合理节点大小 |
| 解码 | 压缩几何和纹理解码占用主线程 | Worker 解码、控制压缩复杂度、分批解析 |
| 上传 | 纹理与缓冲区集中进入 GPU | 分帧上传、纹理压缩、避免重复资源 |
| 绘制 | Draw Call 多、材质状态频繁切换 | 实例化、合批、材质归一与遮挡剔除 |
| 更新 | 每帧遍历全部节点和业务对象 | 脏标记、空间索引、降低非关键更新频率 |
网络与缓存优化
- 为 tileset、几何、纹理设置版本化 URL 和合理缓存头,避免每次访问重新下载。
- 优先请求相机中心、视线方向和当前业务目标附近的节点,快速移动时取消低优先级请求。
- 不要预加载整座园区;可预取相机下一步最可能进入的相邻节点。
- 压缩 JSON 与元数据,但要权衡 Draco 等几何压缩的下载收益和客户端解码成本。
- 监控 404、跨域、取消请求和缓存命中率,避免把失败重试误判为带宽不足。
控制显存与绘制开销
纹理往往比几何更快耗尽显存。对巡检或定位场景,4K 纹理未必带来有效信息,可以采用 KTX2 等 GPU 压缩格式、限制最大尺寸、复用贴图,并为远距离内容准备较低分辨率。
相同设备、树木、灯具和标记适合实例化;大量独立材质会放大 Draw Call 与状态切换。合批时仍需保留对象到批次和实例 ID 的映射,确保选中与属性查询可用。
无限保留已加载节点会让回访很快,却导致移动端崩溃。应根据估算 GPU 字节、最近使用时间和当前视距设置淘汰策略,并在页面后台或场景切换时主动释放。
与实时业务数据共同运行
数字孪生场景还会叠加人员、设备、轨迹、热力与告警。静态 3D Tiles 和动态对象应分层管理:静态层按相机 LOD 调度,动态层按业务订阅更新,界面层只展示当前任务需要的信息。
避免每条实时消息都触发整棵场景树更新。可以合并一个短时间窗口内的消息,在渲染帧前一次性应用;离屏标签降低更新频率,历史轨迹根据屏幕尺度抽稀。
推荐的排查顺序
- 建立基线
固定场景与相机路径,记录网络、CPU、内存、GPU 和帧时间。 - 定位主要阶段
区分等待下载、主线程长任务、GPU 绘制还是业务脚本。 - 一次改变一个变量
分别验证节点大小、误差阈值、并发数、纹理和合批策略。 - 覆盖真实任务
测试搜索跳转、快速切层、连续漫游和大量实时点位。 - 设置性能预算
在数据生产和版本发布流程中持续检查,防止模型更新后回退。
大型三维场景没有单一“最佳参数”。未之鸢技术团队可结合数据结构、目标终端和业务交互,定位从数据生产到 Web 渲染的性能瓶颈。
沟通三维性能优化