kikitte
kikitte
表达式['get', 'rank']的类型为value,因此无法在case表达式中使用,可能由于当前版本mapbox过低无法兼容该做法,因此需要声明其类型为number,可参考如下修改: 
是的,我测试后发现即使不用vite-plugin-cesium,在vite项目中使用MVTImageryProvider会报这个错误,原因是vite尝试将软件包中的mapbox-gl.js转换为ESM([Vite文档](https://cn.vitejs.dev/guide/dep-pre-bundling.html#the-why)),but MVTImageryProvider所使用得mapbox-gl.js是一个commonjs包,vite在转换过程中出现了偏差。我目前对vite不是很熟悉,可能得以后有时间查看了,如果你知道在vite中如何避免转换成ESM的话那就可以解决这个问题。另一种可行的办法是将mapbox-gl.js作为可执行文件通过html的script标签引入,这样子vite就不会对其处理。要修改得地方为: 1. 将mapbox-gl.js的module.exports改为window.Mapbox  2. 将MVTImageryProvider类所在的index.js文件中所有的关于Mapbox的使用改为window.Mapbox 如此,应当可行。
> vite会自动将cjs模块转换为esm,Mapbox Vector Tile Basic JS Renderer的_transformRequest之前在写法上有一点问题,修复之后就可以了,可以看看这个[#21 (comment)](https://github.com/kikitte/MVTImageryProvider/issues/21#issuecomment-1617477186) 谢谢!
问题确认。Chrome浏览器支持的webgl context数量最多为16个,当webgl context数量超过时浏览器会产生警告并导致渲染失败`WARNING: Too many active WebGL contexts. Oldest context will be lost`。在你说的情况当中,cesium viewer占用一个webgl context,由于MVTImageryProvider使用mapbox gl js进行渲染,每个MVTImageryProvider会创建一个webgl context,所以第16次重复创建MVTImageryProvider会导致webgl context数量超标。 我考虑在MVTImageryProvider类中添加destroy方法来彻底销毁与当前实例相关的所有资源,包括webgl context. 临时解决这个报错的方法可在MVTImageryProvider添加如下方法,在新建MVTImageryProvider之前销毁上一个不使用的MVTImageryProvider。 ```javascript destroy() { // TODO:该方法尚未释放其他资源 this.mapboxRenderer._gl.getExtension('WEBGL_lose_context').loseContext(); } ````
已在https://github.com/kikitte/MVTImageryProvider/commit/58d6405fc082adefdca67f4eb64166ec613a18e6 修复
> 首先感谢[kikitte](https://github.com/kikitte)大神的仓库! 我在使用大神的代码时也发现了这个问题,解决的方法是在模块中创建一个全局变量作为BasicRenderer渲染模板,避免出现16个canvas上下文的浏览器限制,具体实现代码可以参考一下[这里](https://github.com/hongfaqiu/MVTImageryProvider/blob/main/src/utils/MVTImageryProvider/index.ts#L34) 此外,频繁创建MVTImageryProvider类会产生内存占用过大的问题,跟踪内存发现是BasicRenderer中的瓦片缓存没有被释放,所以我在releaseTile的同时释放了未在使用的瓦片缓存,可以看看[这处](https://github.com/hongfaqiu/MVTImageryProvider/blob/main/src/utils/MVTImageryProvider/index.ts#L194)的代码。 这相对于在移除Imagery对象时手动调用一次destory()方法,似乎要稍微简便一些,也期待大神的进一步完善。 [这种](https://github.com/hongfaqiu/MVTImageryProvider/blob/main/src/utils/MVTImageryProvider/index.ts#L34)实现方式我考虑的是多个BasicRenderer共用一个canvas可能会造成不可预期的错误,因为我对webgl和mapbox-basic-renderer不熟悉,所以采取保守的方式更为妥当。 [这处](https://github.com/hongfaqiu/MVTImageryProvider/blob/main/src/utils/MVTImageryProvider/index.ts#L194)代码只是放了id为origin的BasicSourceCache对象持有的缓存,具体可看 https://github.com/landtechnologies/Mapbox-vector-tiles-basic-js-renderer/blob/99ba6f3d94eea5dbfed098579f8b8c289854a5a3/src/basic/style.js#L20 如有错误,不吝赐教