共计 1502 个字符,预计需要花费 4 分钟才能阅读完成。
真实场景痛点
最近在做一个智慧城市项目时,需要加载一个包含 200 栋建筑的 BIM 模型。原始模型文件足足有 800MB,首次加载耗时超过 2 分钟,页面直接卡死。这种体验对用户来说是灾难性的,于是我开始研究如何通过模型压缩优化性能。

技术方案详解
1. glTF 与 glb 格式的选择
- glTF:基于 JSON 的文本格式(.gltf),可读性好但体积较大
- glb:二进制格式(.glb),将几何数据、纹理等打包成单个文件
- 对比结论 :生产环境推荐使用 glb,体积通常比 glTF 小 30% 左右
2. Draco 压缩实战
- 原理 :Google 开发的几何压缩算法,通过 Edgebreaker 算法减少顶点数据
- 启用方法 :
Cesium.Viewer('cesiumContainer', {terrainProvider: new Cesium.CesiumTerrainProvider(...),
// 关键配置:启用 Draco 解码器
gltf: {
decompressMeshes: true,
enableDebugWireframes: false
}
});
- 压缩效果 :实测建筑模型顶点数据从 120MB 压缩到 18MB
3. 3D Tiles 分块策略
- LOD 原理 :根据视距动态加载不同精度模型
- 关键参数 (Cesium 1.107+):
const tileset = viewer.scene.primitives.add(
new Cesium.Cesium3DTileset({
url: './tileset.json',
// 控制细节层次的阈值
maximumScreenSpaceError: 2, // 默认 16,数值越小精度越高
dynamicScreenSpaceError: true
})
);
代码示例
带 batchId 的模型加载
const model = viewer.scene.primitives.add(
Cesium.Model.fromGltf({
url: 'compressed.glb',
modelMatrix: Cesium.Matrix4.IDENTITY,
// 启用批处理 ID(用于属性查询)allowPicking: true,
// 内存控制(单位:MB)cacheBytes: 512
})
);
性能测试数据
| 格式类型 | 文件大小 | 加载时间 | GPU 内存占用 |
|---|---|---|---|
| 原始 glTF | 820MB | 128s | 2.1GB |
| Draco 压缩 glb | 185MB | 27s | 680MB |
| 3D Tiles 分块 | 62MB | 9s | 320MB |
避坑指南
- 纹理与几何的平衡
- 建议先压缩几何数据,再考虑纹理
-
保持纹理尺寸为 2 的幂次方(512×512 优于 500×500)
-
内存泄漏排查
- Chrome 开发者工具的 Memory 面板
-
重点关注 Detached DOM tree 和 GPU 内存
-
WASM 兼容性
- 部署时需包含这些文件:
- draco_decoder.wasm
- draco_decoder.js
- 设置正确的 MIME 类型:
AddType application/wasm .wasm
终极方案:Cesium Ion
如果觉得手动优化太复杂,可以直接使用 Cesium Ion 的模型优化服务:
const assetId = 123456; // 在 Ion 平台上传后获取
viewer.cesiumIon.addDefaultImagery();
viewer.cesiumIon.addDefaultTerrain();
const tileset = await Cesium.Cesium3DTileset.fromIonAssetId(assetId);
viewer.scene.primitives.add(tileset);
经过这一系列优化,最终我们的项目加载时间从 2 分钟降到 8 秒,内存占用减少 70%。希望这篇实战总结能帮你少走弯路!
正文完
发表至: 未分类
近两天内
