怎么减小 GLB 文件体积?适合网页 3D 模型的压缩清单
GLB 文件太大时,网页 3D 查看器可能还没显示模型,用户就已经等烦了。但解决办法不一定是“直接开最强压缩”。靠谱的 3D 优化应该有顺序:先去掉浪费,再处理纹理和几何,最后选择合适的压缩算法。
如果你要给商品 3D 展示、配置器、Three.js 场景或 AR 预览减小 GLB 体积,可以按这份清单来。
1. 先看文件到底大在哪里
压缩前先判断体积主要来自哪里:
- 纹理
- 几何体
- 动画
- 重复网格或材质
- 没用的节点、相机、灯光或扩展数据
如果最大的是纹理,只压几何体帮助有限。如果最大的是几何体,Draco 或 meshopt 才更可能明显减小体积。
2. 优先压缩和缩小纹理
很多 GLB 文件的主要体积来自纹理。模型几何可能不复杂,但里面塞了 4K 甚至 8K 图片。
网页场景可以先问:
- 用户真的会放大到需要 4K 纹理吗?
- roughness、metalness、normal map 是否可以比 base color 更小?
- 移动端是否需要和桌面端一样的纹理分辨率?
- 有没有重复纹理可以复用?
如果只是商品小预览,降低纹理尺寸往往比调几何压缩更有效。
3. 移除未使用数据
建模和导出工具经常留下多余内容:
- 隐藏节点
- 空组
- 未使用材质
- 旧相机和灯光
- 重复网格
- 未使用动画轨道
清理这些数据通常风险较低,能在不改变视觉效果的情况下降低文件体积。
4. 谨慎简化几何体
几何简化会减少三角面数量。它对扫描模型、雕刻模型、CAD 转换模型很有用,但也可能破坏轮廓、孔洞、倒角和小细节。
这些情况适合尝试简化:
- 模型细节远超过展示镜头需求。
- 只是背景物体。
- 需要移动端或低带宽版本。
- 可以做前后视觉对比。
不要对 logo、商品边缘、机械结构、用户会近距离查看的部分做过度简化。
5. 选择 Draco 还是 meshopt
Draco 和 meshopt 都是常见 glTF 压缩方式,但侧重点不同。
- Draco 常用于几何压缩,在 glTF 中通过
KHR_draco_mesh_compression扩展表示。 - meshopt 通过
EXT_meshopt_compression表示,面向 glTF buffer 数据,包括几何、动画和其他数值数据。
选择哪一个,要看你的加载器是否支持对应解码器。压缩后的 GLB 只有在运行时能解码对应扩展时才有意义。例如 Three.js 加载 Draco 或 meshopt 压缩模型时,需要配置相应 decoder。
6. 一定要在真实查看器里测试
不要只看文件大小。还要检查:
- 目标查看器能不能加载?
- 材质是否正确?
- 动画是否正常?
- 法线、UV、顶点色是否保留?
- 移动端加载是否真的变快?
- decoder 是否配置正确?
压缩会把一部分网络传输压力转移成 CPU 解码压力。小模型不一定值得引入额外 decoder;大模型通常更值得。
GLB 优化顺序建议
- 缩小纹理。
- 移除未使用数据。
- 去重网格、材质和纹理。
- 安全时合并重复顶点。
- 做视觉对比后再简化几何。
- 应用 Draco 或 meshopt。
- 在真实网页查看器里测试。
一句话总结
减小 GLB 文件体积,先处理纹理和未使用数据,再谨慎简化几何体,最后在加载器支持的前提下使用 Draco 或 meshopt。不要只看压缩率,一定要比较视觉质量,并在真实网页运行环境里测试。
实用流程
优化前先记录基线:文件大小、纹理尺寸、面数、动画需求和目标查看器。然后先处理最大成本:过大的贴图、未使用数据、重复几何体,往往比最后选择 Draco 或 meshopt 更影响网页加载。
导出后要在真实运行环境测试。一个压缩设置在某个查看器里表现很好,但如果上线环境没有加载对应解码器,模型就可能加载失败或回退异常。
检查清单
| 检查项 | 为什么重要 | |---|---| | 解码器支持 | Draco 和 meshopt 都需要加载器兼容。 | | 贴图预算 | 很多网页 GLB 的体积主要来自贴图。 | | 动画模型 | 简化流程可能破坏骨骼或动画。 | | 视觉对比 | 压缩后要看轮廓、法线、UV 和材质。 |
常见问题
先压几何还是先压贴图?
先看体积分布。如果文件主要由贴图构成,缩小或重压贴图通常比只做网格压缩更有效。
使用场景示例
网页 3D 展示要先记录原始 GLB 体积、目标预算和查看器支持的解码器。通常先清理未使用数据、压缩贴图,再根据运行环境选择 Draco 或 meshopt。
压缩后要同时比较加载时间和视觉质量。文件变小但材质错误、动画损坏或首屏解码变慢,都不算真正优化成功。
参考资料: