使用场景: 在单页面应用中(vue,react等),使用地图组件,在切换页面(路由)时,当前高德的地图注销方法不能够完全清除,在多次重复切换(地图与其他页面)时,会导致内存疯狂增长,最后浏览器、页面的崩溃,目前高德地图2.0应该都会有这个问题,最后提交了高德的工单,得到反馈说问题确认存在,各位在使用过程中有没有发现?。

在这里插入图片描述

结局思路及办法:
更新日志:

  • 2022-09-22:貌似高德结构有变,更新canvas画布获取方式~
//在项目中路由跳转时 在对应的组件销毁函数来说 通常会注销map,也就是
map.destroy()

//在跳转直接销毁地图方法后,惊奇的发现,诶??,内存没有被释放?。
//重复上述操作后发现,内存会越来越大,最后内存溢出了,浏览器也就崩溃了,
//在重复调研及提交高德地图的工单之后得到了,肯定的答案 (该问题已知存在)
//此时心里痛骂,项目就要上线,核心功能却有bug...,此时各位靓仔肯定会寻找解决或其他方法规避了吧?
//我也不例外,在寻找了和测试各种demo发现,在2.0的版本的无果,怎么都解决不掉,在一天的放空之后,灵感来了!。
//内存释放不掉就肯定会和页面在注销时 什么东西 没有被清掉 .那么首先从页面的报错消息排查。
//在经过一段时间的重复上述操作后,页面挂壁了。。 同时 控制台也出了报错的提示。
createBuffer error 的错误  
// createBuffer ?? 好像很熟悉的鸭子.. 复制上百度。
//我说这么熟悉,,原来时webgl, 在想想,地图可能使用的webgl来渲染的,会不会是这玩意儿没有清掉??。
//直接开干! mdn搜索webgl,相关注销的方法,
//https://developer.mozilla.org/zh-CN/docs/Web/API/WEBGL_lose_context/loseContext
//虽然没找到直接干掉的方法,但是找到了丢失上下文的方法,废话不多说,直接cv
//注销的时候执行丢失方法,奇迹发生了,内存居然被干掉!,就是这么神奇!

//下面是需要在注销时添加的代码
//var canvas = document.getElementById('canvas');
var canvas = document.querySelector('canvas.amap-layer');
//此处是获取高德生成的地图画布canvas元素,其他方式亦可
var gl = canvas.getContext('webgl');

//监听上下文丢失-可不添加。
canvas.addEventListener('webglcontextlost', function(e) {
  console.log(e);
}, false);
//丢失上下文的方法
gl.getExtension('WEBGL_lose_context').loseContext();

//上述代码可以封装为地图的destroy注销方法中中,
//直到现在 问题搞定,虽然内存还会有些涨(不确定是否时地图外的其他因素),但是已经算是完美解决了,此方法送给各位开发者,大家有其他好用的方法,可以分享一下。

最后送上demo地址 :https://github.com/faintout/AmapDemo
在线demo演示地址 :https://faintout.github.io/Amap

Logo

前往低代码交流专区

更多推荐