三亩地 三亩地SAN MU DI · CODE DIARY
ARTICLE DETAIL

日记详情

真实记录编程学习的某一天,欢迎挑你感兴趣的翻一翻。

cesium如何加载大规模数据

cesium如何加载大规模数据

cesium如何加载大规模数据

Cesium 加载大规模数据的核心思路是分层、分块、按需、流式——把"一次性塞给浏览器"变成"只加载视野内需要的部分"。下面按数据类型分别说明。

一、地形数据(Terrain)

使用 量化网格(quantized-mesh) 格式,配合地形瓦片服务(如 Cesium Ion、自建的 terrain-provider)。

  • 原理:地形按四叉树金字塔分块,根据相机距离/屏幕空间误差(SSE)动态调度对应 LOD 层级。
  • 接口:CesiumTerrainProvider + Cesium.createWorldTerrain() 或自建服务(如 quantized-mesh 切片,推荐用 Cesium Ion / terraintools / maki-terrain 生成)。
  • 关键:服务端要做瓦片金字塔切片,不能直接丢一个完整 DEM 给前端。
viewer.terrainProvider = await Cesium.createWorldTerrainAsync();
// 或自建
viewer.terrainProvider = new Cesium.CesiumTerrainProvider({url: 'https://your-host/terrain',
});

二、影像与栅格(Imagery)

使用 WMTS / TMS / XYZ / Bing / 自建瓦片服务,按瓦片金字塔按需请求。

  • Cesium ImageryLayer 内部已做视锥剔除 + 屏幕空间误差控制,只请求当前可见瓦片。
  • 大图不要一次性传 SingleTileImageryProvider,应切成瓦片金字塔。
  • 工具:gdal2tilesrio-tiler、Cesium Ion 上传栅格自动切片。

三、三维瓦片(3D Tiles)—— 大规模三维模型的核心方案

这是 Cesium 处理大规模三维数据(建筑、倾斜摄影、点云、BIM)的标准答案

核心机制:

  1. 瓦片集(Tileset)Cesium3DTileset,数据按树状层级组织。
  2. LOD + 屏幕空间误差(SSE)maximumScreenSpaceError 控制何时加载更细层级,数值越小越精细、越吃性能。
  3. 视锥剔除 + 遮挡剔除:只渲染视野内、未被遮挡的瓦片。
  4. 批处理 + GPU instancing:一个瓦片内成千上万图元一次性渲染。
const tileset = await Cesium.Cesium3DTileset.fromUrl('https://host/tileset.json');
viewer.scene.primitives.add(tileset);
tileset.maximumScreenSpaceError = 16; // 数值越大越粗糙、越省性能

优化点:

  • COMPOSITE / INSTANCED_3DMODEL / POINTCLOUD 等瓦片格式分类处理。
  • 服务端用 3D Tiles 1.1 的 implicit tiling(隐式瓦片) + 空间索引(quadtree/octree/subtree),避免超大的 tileset.json
  • 切片工具:Cesium Ion、3d-tiles-toolspy3dtilescitygml-to-3dtiles

四、大规模点/矢量数据

数据量推荐方案
几百~几千点 Entity + Billboard/Point(简单,但量大卡顿)
几万~几十万 Primitive + BillboardCollection/PointPrimitiveCollection(手动批量)
百万级+ 3D Tiles(点云)GeoJSON 转 3D Tiles,或 Cesium3DTilesetPOINTCLOUD 格式
动态海量点 PointPrimitiveCollection + 按视域剔除,避免每帧重建

矢量线/面同理:量大时转成 3D Tiles(如 VectorTiles / GeoJSON → 3D Tiles),不要用 Entity

五、动态/实时数据(流式)

  • CZML:适合随时间变化的实体,Cesium 会按时间窗口增量解析,但数据量极大时仍需分片。
  • WebSocket / Server-Sent Events:业务层自定义推送,Cesium 端只更新 Entityposition/property,配合 SampledPositionProperty 做插值,避免每帧重算。
  • 不要一次性 push 全量历史数据;分窗口请求当前时间窗内的数据。

六、通用性能调优

  1. 关掉不必要的精度viewer.scene.globe.tileCacheSize 控制瓦片缓存大小;requestRenderMode 在无交互时停止渲染(省 CPU/GPU)。
  2. maximumScreenSpaceError:地形/3DTiles 调大可显著降低加载量。
  3. preloadWhenHidden / preloadFlightDestinations:预加载策略,按需开启。
  4. 合并请求:服务端用 HTTP/2、按 subtree 批量返回;前端避免小文件海请求。
  5. 内存释放:超出视野的瓦片会自动 LRU 淘汰;自建 PrimitiveCollection 时记得 remove 不再用的元素。
  6. 数据端先做金字塔/切片:90% 的卡顿来自"把一坨大数据直接丢前端",而不是 Cesium 本身的渲染。

一句话总结:Cesium 加载大规模数据靠的不是"加载更快",而是"加载更少"——靠瓦片金字塔 + LOD + 视域/遮挡剔除,让任何时刻只把"当前视野、当前精度需要的瓦片"送进 GPU。3D Tiles 是大规模三维数据的统一答案,地形走 quantized-mesh,影像走 WMTS/TMS,海量点/矢量也转成 3D Tiles。

← 返回列表