3D Tiles 性能优化:Cesium 加载卡顿与瓦片切分的 6 个参数
首屏转圈、漫游掉帧、看一会儿崩掉是三种不同的问题,解法方向经常相反。本文给出每个参数的代价对照、症状速查表与调优纪律。
引子:卡,到底卡在哪?
一个园区模型,拖进去,切片,输出 3D Tiles,发到 Cesium。
首屏转了快 30 秒。终于出来了,镜头往前一推——掉帧。再转两圈,标签页直接崩了。
于是开始调参:纹理尺寸从 1024 降到 512,掉帧好了一点,近景却糊了;最大 LOD 从 5 加到 7,远景轻了,首屏反而更慢。
折腾一下午,越调越乱。
问题不在你调的参数,在于你调错了对象。
首屏慢、漫游掉帧、内存爆,这是三种不同的病。把首屏慢当成掉帧来治,只会越治越糟。
而这三类问题,GeoForge 在设计上就把对应的参数全部暴露出来了——不是黑盒,也不是让你去猜。下面先说它到底解决什么,再说为什么管用。
一、GeoForge 解决的三类性能问题
GeoForge 是一款做三维空间数据准备与发布的图形化工作台。它把模型、IFC、Datasmith、倾斜摄影、点云、GIS 矢量转成 3D Tiles,并且把影响性能的每一项都做成了可调参数。
先对号入座,看你的问题属于哪一类:
| 你遇到的现象 | 真正的瓶颈 | GeoForge 的解法 | 对应参数 |
|---|---|---|---|
| 首屏转圈十几秒才出画面 | 传输量、请求数、单瓦片体积 | 控制瓦片粒度和纹理体量 | 最大三角面数/节点、纹理尺寸上限、纹理容量上限、纹理编码 |
| 加载出来了,一动镜头就掉帧 | 几何复杂度、Draw Call、纹理显存 | 几何与材质层面的自动优化 | 网格量化、实例化、纹理图集、材质烘焙、LOD 级别 |
| 看一会儿内存飙升、标签页崩掉 | 层级过深、瓦片未释放 | 控制层级深度和空间组织 | 最大 LOD 级别、空间分割策略(四叉树/八叉树) |
| 远景跳变、轮廓破碎 | 缺少中间过渡层级 | 生成由粗到细的外壳代理层 | 体素重建层级 |
| 点云一加载就卡 | 单瓦片点数过多 | 控制采样率和单瓦片点数 | 采样百分比、最大点数/瓦片 |
| 调完参数,下次又得重调一遍 | 缺乏可复现的工作方式 | 预设复用 + 作业复制 | 参数预设(可导出 JSON) |
这六行,就是 GeoForge 在性能这件事上真正解决的问题。
它不负责替你诊断——那是浏览器 DevTools 的活儿。但它保证了一件事:当你知道瓶颈在哪,你手上有对应的旋钮可以拧。
下面解释这些旋钮为什么管用。
二、为什么这些旋钮管用:3D Tiles 的加载机制
要看懂参数,得先知道 3D Tiles 是怎么工作的。三个概念,五分钟。
1. 空间分层:把大场景切成一棵树
转换完成后,输出目录根路径会有一个 tileset.json。它不是数据本身,而是一棵瓦片树的目录:每个节点对应一块空间区域,带一个包围盒,指向一份实际内容。根节点最粗,越往下越细。
客户端只加载“当前视野需要的那几层”。这就是按需加载。
2. geometricError:LOD 切换的标尺
每个瓦片带一个 geometricError,单位是米,含义是用这个节点的精度来表示它覆盖的区域,最坏情况下的误差是多少。
根节点误差最大,叶子节点接近 0。这个值不用你手填——GeoForge 会根据 LOD 设置自动算出来。你要做的是控制误差收敛到什么程度。
3. 屏幕空间误差 SSE:什么时候该加载更细的一级
textSSE = geometricError × 视口高度 / (距离 × 2 × tan(FOV / 2))距离越近,SSE 越大,越容易超过阈值,触发加载更细的子瓦片;距离越远,保持当前粗糙层级就够。当 SSE 超过 maximumScreenSpaceError(Cesium 里默认是 16)时,引擎就去取下一级。
这就是为什么“远近自动分级”不需要你做多套模型——它靠这个公式在运行时算。GeoForge 的任务,是让每一级的 geometricError 收敛得合理。
三、六个关键参数:每个都是“代价换收益”
下面这张表是全文的核心。请重点看最后一列——GeoForge 里每个优化都有代价,没有白拿的性能。这也是为什么“调完更卡”经常发生。
| 参数 | 治什么问题 | 调大的代价 | 调小的代价 |
|---|---|---|---|
| 最大三角面数/节点 | 瓦片粒度(默认 1572864) | 瓦片更少更大,单瓦片重、首屏慢 | 瓦片更多更小,请求数暴涨 |
| 最小 LOD 级别 | 最精细层级(默认 0) | — | 0 即保留原始精度 |
| 最大 LOD 级别 | 远景简化深度(默认 5) | 远景更轻,但层级数与转换耗时上升 | 远景更重,漫游压力大 |
| 体素重建层级 | 远景外壳过渡(默认 0 关闭) | 过渡更平滑,成本指数增长 | 远景轮廓破碎、切换生硬 |
| 纹理尺寸上限 | 纹理显存与传输(默认 1024,0 不限制) | 近景清晰,体量明显上升 | 传输小,近景糊 |
| 纹理容量上限(KB) | 单瓦片纹理负载 | 单瓦片更重 | 单瓦片轻,瓦片数上升 |
| 纹理编码 | 传输体量与质量(默认 / ETC1S / UASTC) | UASTC 质量高、体量大 | ETC1S 体量小、质量低 |
| 空间分割策略 | 空间组织方式 | 四叉树适合地表延展,八叉树适合高差大的立体场景 | — |
| 采样百分比(点云) | 总点量(1–100) | 细节丰富,体量线性增长 | 体量小,细节丢失 |
| 最大点数/瓦片(点云) | 单瓦片渲染压力(默认 200000) | 文件少,单瓦片重 | 单瓦片轻,瓦片数上升 |
还有一组默认就开着的高级优化,GeoForge 里不用你配,除非在排查问题否则别关:
- 材质烘焙:合并纯色材质,为纹理图集创造条件
- 纹理图集:把可合并的纹理打包,减少材质切换 → 直接降 Draw Call
- 实例化:重复对象转成 GPU 批量绘制 → 构件重复率高时收益巨大
- 网格量化:压缩顶点数据 → 直接减几何传输量和显存
单独说“体素重建层级”
它是唯一一个成本指数增长的参数,也是 GeoForge 做得比较诚实的地方——不丢给你一个 0–7 的滑块让你瞎试,而是明确给出成本:
| 层级 | 累计生成的代理数量 |
|---|---|
0 | 不生成(默认) |
1 | 1 |
2 | 9 |
3 | 73 |
4 | 585 |
3 级是 2 级的 8 倍多,4 级又是 3 级的 8 倍。
所以:先用 0 跑通,再复制作业对比 1 或 2。 大型园区建议从 2 起试;只有明确需要“远景连续外壳浏览”且机器资源充足,才考虑 3。
四、实操:用 GeoForge 走一次性能调优
四步。注意每一步只改一个参数——这是前提。
第 1 步:建基线
用默认参数转一次,在本地服务预览里记录四个数字:首屏可交互时间、首屏请求数/总传输量、漫游平均 FPS、峰值内存。
没有基线,后面所有调整都是瞎猜。
第 2 步:看请求瀑布图,定位瓶颈
浏览器 DevTools → Network → 勾 Disable cache → 刷新。这一步直接告诉你瓶颈在哪:
- 请求数很多、每个都不大(几十 KB)→ 瓦片切太碎 → 把“最大三角面数/节点”调大
- 请求数不多、但有超大文件(几 MB 到几十 MB)→ 瓦片太粗 → 把“最大三角面数/节点”调小
- 首屏被拖住、后续流畅 → 瓶颈在传输 → 动纹理编码和纹理尺寸上限
- 首屏还行、越走越卡 → 瓶颈在渲染和内存 → 动 LOD 层级和几何优化
第 3 步:在 GeoForge 里复制作业,针对性调参
不要改原来那个作业。 用“复制”建一个变体,改一个参数,跑,对比。
| 瓶颈 | 优先调整 | 观察指标 |
|---|---|---|
| 传输量 | 纹理编码 → ETC1S;纹理尺寸上限降到 512 | 总传输量、首屏时间 |
| 请求数 | 最大三角面数/节点调大 | 请求数下降 |
| 单瓦片过重 | 最大三角面数/节点调小;纹理容量上限调小 | 最大单瓦片体积、首帧时间 |
| 漫游掉帧 | 确认实例化/纹理图集/网格量化开启;必要时降纹理尺寸上限 | 平均 FPS、Draw Call |
| 远景生硬 | 体素重建层级从 1/2 试起 | 远景加载连续性 |
| 内存飙升 | 降低最大 LOD 级别;检查分割策略是否匹配场景形态 | 峰值内存 |
第 4 步:存成预设,闭环
调好的参数组合在 GeoForge 里保存为预设,可导出 JSON 给团队复用。下次同类数据直接套,不用重调一遍。
而验证闭环也是本地的——GeoForge 一键发布本地 HTTP 服务,浏览器打开就能测首屏和 FPS,不用先传到平台再等结果。
五、症状 → 参数 速查表
最省时间的用法,直接查。
| 症状 | 最可能的原因 | 在 GeoForge 里先调这个 |
|---|---|---|
| 首屏 10 秒以上才出画面 | 传输量大 / 请求数多 | 纹理编码、纹理尺寸上限、最大三角面数/节点 |
| 镜头一推近就卡顿 | 子瓦片过重 | 最大三角面数/节点、纹理容量上限 |
| 远景轮廓破碎、跳变 | 缺少代理层 | 体素重建层级(1 或 2) |
| 漫游越久越卡 | 内存未释放 / 层级过深 | 最大 LOD 级别、空间分割策略 |
| 近景糊但远景正常 | 纹理尺寸压过头 | 纹理尺寸上限调回 1024 或更高 |
| 移动端直接崩 | 纹理显存超限 | 纹理尺寸上限、纹理编码改 ETC1S |
| 加载后全是白色方块 | 材质未烘焙 / 纹理图集异常 | 检查高级优化开关是否被误关 |
| 点云卡顿 | 单瓦片点数过多 | 最大点数/瓦片、采样百分比 |
| 点云颜色异常 | 颜色格式不兼容 | 强制 4 字节 RGB |
| 有重复构件但没省下来 | 实例化未生效 | 确认实例化开启;点状数据改用实例模型流程 |
六、怎么测:四个必看的指标
不要凭“感觉流畅”下结论,要有数字。
1. 首屏可交互时间 — 从发起到画面可交互。这是用户唯一真正感知的加载指标。
2. 首屏请求数与总传输量 — DevTools → Network → Disable cache → 刷新。
3. 漫游平均 FPS — Performance 面板。重点看掉帧瞬间对应加载了哪个瓦片。
4. 峰值内存 — DevTools → Memory。正常曲线是“上升后进入平台期小幅波动”。如果一路向上不回落,说明瓦片没被释放,问题在层级深度或客户端缓存配置。
用 Cesium 的话,还有更直接的入口:
jstileset.tilesLoaded // 当前层级瓦片是否加载完毕
tileset.maximumScreenSpaceError // 默认 16,调大更省性能
tileset.maximumMemoryUsage // 默认 512,单位 MB
tileset.tileCacheSize // 缓存瓦片数量这四个值调一遍,比在切片端瞎改十个参数有用得多。
七、四个最常见的误区
LOD 级别越多越好
层级越多,转换越慢,客户端要管理的节点也越多,内存压力反而更大。小模型、室内模型,0–5 通常足够。只有大范围场景才需要更深。
纹理压得越狠越好
ETC1S 能把体积压得很小,但它有损,近景会出现明显色块和模糊。分场景选:移动端弱网用 ETC1S,桌面端高质量展示用 UASTC,要最大兼容性用“默认”保留原纹理。前提是确认目标平台支持 KTX2。
瓦片切得越细越好
瓦片越细,按需加载越精准。但每个瓦片都是一次 HTTP 请求,瓦片数量爆炸会直接压垮首屏。单瓦片体积和瓦片数量之间存在最优区间,找它的方法就是第二节那个瀑布图。
不固定测试条件就下结论
不清缓存、换视角、换网络、换设备,然后得出“改了参数变快了”。这种结论 100% 是假的。调优是控制变量实验,不是感觉。
八、五条纪律
压缩成五条,建议贴在显示器边上:
- 先定位瓶颈,再动参数。 首屏慢和掉帧是两件事。
- 一次只改一个参数。 改两个,你永远不知道是哪个起了作用。
- 永远保留对照组。 别覆盖验证过的作业,用 GeoForge 的“复制”建变体。
- 固定测试条件。 同一视角、同一网络、同一设备、清缓存。
- 先小样本,后全量。 拿一个街区调参,调好了再上整个园区。
这五条比任何一个参数都值钱。
九、验收:交付前量化一遍
加载
- 首屏可交互时间在目标网络下可接受
- 首屏请求数和总传输量已记录
- 无单个异常巨大的瓦片
渲染
- 漫游平均 FPS 达标(桌面端/移动端分别测)
- 掉帧位置和原因已定位
- Draw Call 在合理区间(重复构件已实例化)
内存
- 长时漫游后内存进入平台期,不持续上涨
- 移动端不因显存超限崩溃
画质
- 近景纹理无明显色块、模糊
- 远景轮廓连续,无破碎跳变
- 与地形、影像、点云叠加无偏移
记录
- 使用的流程与关键参数
- 预设名称
- 测试环境(设备、浏览器、网络)
- 已知限制
十、为什么用 GeoForge 做这件事
回到最开始那张表。这些能力背后,GeoForge 有几个特点值得说清楚:
✅ 影响性能的参数全都暴露在界面上,不是黑盒 LOD 级别、单节点三角面预算、空间分割策略、体素重建层级、纹理尺寸与容量上限、纹理编码、材质烘焙、纹理图集、实例化、网格量化——每一项都能调,也都能关掉做对比。
✅ 体素重建层级给了明确的成本对照 不是丢个滑块让你瞎试,而是告诉你 1 级 1 个代理、2 级 9 个、3 级 73 个、4 级 585 个。知道代价,才知道该不该开。
✅ 预设 + 作业复制,天然支持“控制变量” 复制一个作业改一个参数,跑完直接对比。这正是性能调优最需要的工作方式,GeoForge 把它做成了默认操作。
✅ 8 类数据用同一套性能模型 模型、IFC、Datasmith、倾斜摄影走 LOD + 瓦片 + 纹理;点云走采样 + 单瓦片点数;GIS 矢量走实例化。不用为每种数据换一套心智模型。
✅ 本地服务一键预览,调优闭环在本地完成 转完直接发本地 HTTP 服务,浏览器打开就能测首屏和 FPS,不用先传到平台再等结果。
✅ 免费开放,不限制高级功能 LOD、纹理压缩这些“高级选项”不额外收费,也不用为了调参去买套餐。
官网地址:https://www.geoforge.cn/
十一、常见问题
Q:模型转完只有几百 KB,加载还是很慢,为什么? 大概率是请求数问题,不是体积问题。几百个几十 KB 的小瓦片,HTTP 开销会拖死首屏。把“最大三角面数/节点”调大,减少瓦片数量。
Q:为什么我调了参数,效果反而更差了? 因为每个优化都有代价。调小单瓦片体积会让瓦片数上升;调大 LOD 层级会让内存压力上升。先明确你要优化的是首屏、帧率还是内存,再动手。
Q:点云需要配 LOD 吗? 不需要。点云流程的杠杆是采样百分比和单瓦片最大点数。
Q:纹理编码选 ETC1S 还是 UASTC? ETC1S 体量小、质量低,适合移动端和弱网;UASTC 质量高、体量大,适合桌面端高质量展示。选之前先确认目标平台支持 KTX2。
Q:远景突然跳变、轮廓破碎怎么办? 说明缺少中间过渡层级。可以把“体素重建层级”设 1 或 2 试起,但它的成本是指数增长的,别一上来就拉满。
Q:GeoForge 能直接告诉我哪里性能不好吗? 它负责生成合理的瓦片结构,不替代浏览器 DevTools。诊断还是看 Network、Performance、Memory 三个面板,第六节给了具体入口。
最后
3D Tiles 性能优化,本质上不是“调参数”,而是在传输量、请求数、渲染压力、内存占用之间找平衡点。
这个平衡点对每个场景都不一样——园区和城市不一样,桌面端和移动端不一样,模型和点云更不一样。
所以别问“最优参数是什么”,要问的是:我现在卡在哪一层,我能接受什么代价。
GeoForge 做的事很简单:把这六个旋钮交到你手上,并且告诉你每个旋钮的代价。
从今天开始,让三维数据上云不再是难题。
GeoForge —— 让三维数据上云变得简单高效 更多技术细节与操作指南,请参考完整使用手册
返回文档中心