共计 1371 个字符,预计需要花费 4 分钟才能阅读完成。
背景与痛点
GLB 作为 glTF 的二进制格式,已成为 Web 和移动端 3D 应用的标准。但原生导出的 GLB 模型经常遇到:

- 10MB+ 的模型导致移动端首屏加载超 5 秒
- 复杂场景同时加载多个模型时内存飙升
- 低端设备渲染高模时出现卡顿
这些痛点直接影响了用户体验和转化率。通过实测,一个未优化的角色模型(3 万面)在 Chrome 移动端需要 3.2 秒加载,而压缩后可降至 0.8 秒。
技术方案对比
1. 几何压缩
- Draco 压缩 :Google 开源算法,压缩率 60-80%,但需要解码时间
- 简化修改器 :直接减少面数,适合中低端设备
2. 纹理优化
- 使用 Basis Universal 格式替代 PNG/JPG
- 将 2048×2048 贴图降级为 1024×1024
- 合并材质槽减少 draw call
3. 动画优化
- 减少关键帧采样率(如 30fps→15fps)
- 使用骨骼动画替代形变动画
Blender 实战步骤
基础导出设置
- 安装官方 glTF 导出插件(Blender 3.4+ 内置)
- 文件 > 导出 > glTF 2.0 格式
- 关键参数配置:
{ "format": "GLB", "export_textures": True, "export_draco_mesh_compression": True, # 启用 Draco "draco_compression_level": 6 # 压缩级别 (1-10) }
几何简化案例
- 添加 Decimate 修改器:
- Ratio=0.5(减少 50% 面数)
- 勾选 Triangulate 保持拓扑
- 使用 Python 批量处理:
import bpy for obj in bpy.context.selected_objects: mod = obj.modifiers.new(name="Decimate", type='DECIMATE') mod.ratio = 0.5
纹理优化技巧
- 使用 Image > Pack Resources 内嵌纹理
- 通过 Baking 将多张贴图合并为 ORM 图(Occlusion/Roughness/Metallic)
动画优化脚本
def optimize_animation():
action = bpy.data.actions["WalkCycle"]
for fcurve in action.fcurves:
# 每 2 帧保留 1 个关键帧
for kp in fcurve.keyframe_points[::2]:
fcurve.keyframe_points.remove(kp)
避坑指南
- 破面问题 :
- Draco 级别不要超过 7
-
保留至少 15% 的原始面数
-
贴图失真 :
- 检查 UV 是否重叠
-
禁用 Mipmap 生成
-
动画卡顿 :
- 确保骨骼数量 < 50
- 避免 scale 和 shear 变换
性能测试数据
| 优化方式 | 文件大小 | 加载时间 (3G) | GPU 内存 |
|---|---|---|---|
| 原始模型 | 12.4MB | 4200ms | 136MB |
| Draco+ 简化 | 3.2MB | 1100ms | 48MB |
| 纹理压缩 + 动画优化 | 1.8MB | 800ms | 32MB |
进阶建议
-
Three.js 中启用渐进加载:
new GLTFLoader() .setDRACOLoader(dracoLoader) .load(model.glb, gltf => {scene.add(gltf.scene); }); -
使用 WASM 解码器提升 Draco 解压速度
-
实现按需加载的 LOD 系统
动手挑战
尝试优化提供的 示例模型 :
- 使用 Decimate 修改器将面数减至 1.5 万
- 应用 Basis Universal 压缩所有贴图
- 提交优化前后的性能对比截图
正文完
