cesium销毁内存泄漏问题优化

在vue开发SPA实际项目中,不止涉及到使用cesium可视化的大屏一个界面,在切换路由,页面或者关闭该功能、弹框后,cesium加载的模型,图层,实体等等信息会缓存到电脑的显存中,但是切回cesium界面的时候,又会重新进入页面的挂载周期,进行新的cesium实例的渲染,显存占用会越来越大,达到临界值后,页面会崩溃,显示out of memory或者是cesium页面红色弹框的shader错误

 遇到问题要解决咯,首先肯定也是想到在页面destory()周期中进行卸载cesium的相关操作,但是也踩了很多坑,之前采用的方法就是直接给viewer清空并置空

viewer && viewer.destroy()
viewer = null

但是这样一直清除不干净,虽然比不清除之前好,显存还是会每次小幅度上升,因为viewer嵌套关系过多,这个可能只释放了viewer对象,但里面的很多图形信息,还是存在显存中的,今天找了套相对来说最干净的方法,直接上效果对比,注意看显卡的专用GPU内存占用情况,我的电脑显卡1660TI MAXQ,还没加载模型,重复来回点击十几次也会崩溃了

首先要注意一个老生常谈的问题,在vue框架中使用cesium,一定切记,不要把ceisum的相关对象放在响应式中!   这个嵌套的层级太深了,会严重影响性能,要不就用个let接收,要不就放在window中,如果其他页面也要使用和操作该cesium对象的话

修复之前

左侧第一个按钮为cesium的功能,第二个按钮是二维的leaflet功能,从第二个切到第一个按钮明显会看到显存曲线的上升趋势,但是从第一个切到第二个时,回落不明显,显存发生泄露,显存占用越来越大,风险很大

修复后效果

上升又回落

废话不多说,直接上干货,代码

注意下有个坑,那个primitives  不要removeAll,本来项目中也没有primitives,而且清除之后,在destory viewer会报错,所以就暂时先注释掉,后续有大神了解的话,可以解答下这个primitives为啥会出现这个问题

还有就是viewer.destory() 要放在前面哪些entities的removeAll后面,否则会报错导致不生效没清除干净,最后再都置为null

// 销毁cesium
    destroyCesiumViewer() {
    if (Cesium.defined(viewer)) {
      viewer.entities.removeAll()
      viewer.imageryLayers.removeAll()
      viewer.dataSources.removeAll()
      // viewer.scene.primitives.removeAll();
      // 获取webgl上下文
      let gl = viewer.scene.context._originalGLContext;
      gl.canvas.width = 1;
      gl.canvas.height = 1;
      viewer.destroy(); // 销毁Viewer实例
      gl.getExtension("WEBGL_lose_context").loseContext();
      gl = null;
      window.viewer = null;
      var cesiumContainer = document.getElementById('cesiumContainer');
      if (cesiumContainer) {
        cesiumContainer.remove(); // 移除与地图相关的DOM元素
      }
      console.log('cesium销毁')

      // 清理其他JavaScript对象和事件监听器
      // ...
    }

  • 33
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 16
    评论
优化 Cesium 加载 3D Tiles 的方法有很多,以下是一些建议: 1. 使用 Level of Detail (LOD):3D Tiles 可以包含多个 LOD,可以根据距离动态加载相应的 LOD。这可以减少加载时间和提高性能。 2. 压缩 3D Tiles 数据:使用压缩算法(如 gzip、brotli)可以减少传输时间和数据大小。 3. 使用 Batch Table 和 Batched 3D Models:Batch Table 可以将多个 3D Models 组合成一个单独的 3D Model,这样可以减少网络请求次数。Batched 3D Models 可以将多个图元(如三角形、线段等)组合成一个单独的图元,这样可以减少 GPU 的绘制调用次数。 4. 使用 Web Workers:将计算密集型任务(如加载、解析和渲染 3D Tiles)分配到 Web Workers 中,可以减少主线程的负载,提高性能。 5. 可视化范围控制:可以根据相机的位置和方向,限制加载的 3D Tiles 的数量和范围。这可以减少不必要的加载和绘制操作,提高性能。 6. 减少不必要的属性和几何信息:如果可以,尽量减少不必要的属性和几何信息。这可以减少数据大小和 GPU 的工作量,提高性能。 7. 启用硬件加速:如果支持 WebGL 2.0,可以启用硬件加速,这可以提高性能。如果不支持 WebGL 2.0,可以使用 WebGL 1.0,并启用所有可用的硬件加速选项,如各种扩展和纹理压缩等。 总之,优化 Cesium 加载 3D Tiles 的性能需要综合考虑多个因素,并根据具体情况采取相应的措施。
评论 16
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值