首先,先说几个注意的点,看看你踩坑了吗?
问题例子:
一,Cesium中的viewer对象,一定不要保存在vue的data结构树中,会非常影响性能。
二,Cesium中的entities对象,也不要赋值到data中,本人经历,我只是赋值了一个entities,结果浏览器就崩了,
三,处理大量数据时候的解决方式(10w+数据)。
解决方式:(一,二)
因为一,二都是同一种问题,所以解决方式大概相似。
原因是:vue数据深度监听和地图对象存在引用关系导致内存无法释放,导致浏览器性能消耗过大。
方法一:使用Object.freeze()方法 (还要继续将数据放在data中【不推荐】,不过要是只用数据展示并且不想改动太多代码也可以使用)
this.activeEntity = Object.freeze(entity)
方法二:将Cesium对象数据注册到window对象中(推荐)。这样即是响应的数据也不会消耗过多内存。
window.viewer = new Cesium.Viewer("cesiumContainer",{
terrainProvider: Cesium.createWorldTerrain(), // 加载全球地形数据
imageryProvider: new Cesium.IonImageryProvider({ assetId: 2 }), // 加载 Bing Maps 影像数据
homeButton: true, // 启用主页按钮
sceneModePicker: true, // 启用场景模式选择器
geocoder: true, // 启用地理编码器(地址搜索)
baseLayerPicker: true, // 启用图层选择器
timeline: true, // 启用时间线控件
animation: true, // 启用动画控件
fullscreenButton: true, // 启用全屏按钮
})
window.activeEntity = entity
注意点:在不再使用的无论是entity对象,还是primitives对象,或者是整体viewer,都要及时注销掉。
注销方式如:
entities:
- viewer.entities.removeAll()
- viewer.entities.removeById(entityId); // 删除指定的 Entity 对象id
- viewer.entities.remove(entity); // 删除指定的 Entity 对象
primitives:
- viewer.scene.primitives.removeAll()
- viewer.scene.primitives.remove(primitive); // 删除指定的 Primitive 对象
viewer:
- viewer = null
- viewer.destroy();
解决方式(三)
大家可以参考下面的链接,方法还是很不错的,而且很详细。
https://blog.youkuaiyun.com/weixin_42508580/article/details/126927483