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 级别最精细层级(默认 00 即保留原始精度
最大 LOD 级别远景简化深度(默认 5远景更轻,但层级数与转换耗时上升远景更重,漫游压力大
体素重建层级远景外壳过渡(默认 0 关闭)过渡更平滑,成本指数增长远景轮廓破碎、切换生硬
纹理尺寸上限纹理显存与传输(默认 10240 不限制)近景清晰,体量明显上升传输小,近景糊
纹理容量上限(KB)单瓦片纹理负载单瓦片更重单瓦片轻,瓦片数上升
纹理编码传输体量与质量(默认 / ETC1S / UASTCUASTC 质量高、体量大ETC1S 体量小、质量低
空间分割策略空间组织方式四叉树适合地表延展,八叉树适合高差大的立体场景
采样百分比(点云)总点量(1100细节丰富,体量线性增长体量小,细节丢失
最大点数/瓦片(点云)单瓦片渲染压力(默认 200000文件少,单瓦片重单瓦片轻,瓦片数上升

还有一组默认就开着的高级优化,GeoForge 里不用你配,除非在排查问题否则别关:

  • 材质烘焙:合并纯色材质,为纹理图集创造条件
  • 纹理图集:把可合并的纹理打包,减少材质切换 → 直接降 Draw Call
  • 实例化:重复对象转成 GPU 批量绘制 → 构件重复率高时收益巨大
  • 网格量化:压缩顶点数据 → 直接减几何传输量和显存

单独说“体素重建层级”

它是唯一一个成本指数增长的参数,也是 GeoForge 做得比较诚实的地方——不丢给你一个 0–7 的滑块让你瞎试,而是明确给出成本:

层级累计生成的代理数量
0不生成(默认)
11
29
373
4585

3 级是 2 级的 8 倍多,4 级又是 3 级的 8 倍。

所以:先用 0 跑通,再复制作业对比 12 大型园区建议从 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 秒以上才出画面传输量大 / 请求数多纹理编码、纹理尺寸上限、最大三角面数/节点
镜头一推近就卡顿子瓦片过重最大三角面数/节点、纹理容量上限
远景轮廓破碎、跳变缺少代理层体素重建层级(12
漫游越久越卡内存未释放 / 层级过深最大 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 级别越多越好

层级越多,转换越慢,客户端要管理的节点也越多,内存压力反而更大。小模型、室内模型,05 通常足够。只有大范围场景才需要更深。

纹理压得越狠越好

ETC1S 能把体积压得很小,但它有损,近景会出现明显色块和模糊。分场景选:移动端弱网用 ETC1S,桌面端高质量展示用 UASTC,要最大兼容性用“默认”保留原纹理。前提是确认目标平台支持 KTX2

瓦片切得越细越好

瓦片越细,按需加载越精准。但每个瓦片都是一次 HTTP 请求,瓦片数量爆炸会直接压垮首屏。单瓦片体积和瓦片数量之间存在最优区间,找它的方法就是第二节那个瀑布图。

不固定测试条件就下结论

不清缓存、换视角、换网络、换设备,然后得出“改了参数变快了”。这种结论 100% 是假的。调优是控制变量实验,不是感觉。

八、五条纪律

压缩成五条,建议贴在显示器边上:

  1. 先定位瓶颈,再动参数。 首屏慢和掉帧是两件事。
  2. 一次只改一个参数。 改两个,你永远不知道是哪个起了作用。
  3. 永远保留对照组。 别覆盖验证过的作业,用 GeoForge 的“复制”建变体。
  4. 固定测试条件。 同一视角、同一网络、同一设备、清缓存。
  5. 先小样本,后全量。 拿一个街区调参,调好了再上整个园区。

这五条比任何一个参数都值钱。

九、验收:交付前量化一遍

加载

  • 首屏可交互时间在目标网络下可接受
  • 首屏请求数和总传输量已记录
  • 无单个异常巨大的瓦片

渲染

  • 漫游平均 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:远景突然跳变、轮廓破碎怎么办? 说明缺少中间过渡层级。可以把“体素重建层级”设 12 试起,但它的成本是指数增长的,别一上来就拉满。

Q:GeoForge 能直接告诉我哪里性能不好吗? 它负责生成合理的瓦片结构,不替代浏览器 DevTools。诊断还是看 Network、Performance、Memory 三个面板,第六节给了具体入口。

最后

3D Tiles 性能优化,本质上不是“调参数”,而是在传输量、请求数、渲染压力、内存占用之间找平衡点

这个平衡点对每个场景都不一样——园区和城市不一样,桌面端和移动端不一样,模型和点云更不一样。

所以别问“最优参数是什么”,要问的是:我现在卡在哪一层,我能接受什么代价。

GeoForge 做的事很简单:把这六个旋钮交到你手上,并且告诉你每个旋钮的代价。

从今天开始,让三维数据上云不再是难题。

GeoForge —— 让三维数据上云变得简单高效 更多技术细节与操作指南,请参考完整使用手册

上一篇Datasmith 转 3D Tiles:Unreal Engine 与 Cesium 交付

开始自己的第一次转换

下载桌面版,用一份真实样本验证坐标、材质与加载表现。

返回文档中心