记录一次高德地图性能提升实践

介绍

最近开发任务中用上了我们自己开发的可视化图层gl-layers,同事发现把图层加入后CPU占用率非常高,这将直接导致页面帧率下降,从而引起画面不流畅,于是找到我排查其中原因。这刚好是一次不错的性能优化实践,于是把它记录下来以备今后朋友们不时之需。

操作步骤

  1. 看看整体的性能监控是否有异常(右上角折叠菜单icon - More tools - Performance monitor),在本示例中发现CPU占用率长期维持在90%以上,我们需要分析具体原因。

  2. 打开性能选项卡,录制几秒的过程,就可以非常清晰看到每帧的执行状态和任务的健康状态

  3. 点击Task-Summary 查看当前任务时间花费在哪里了,如图中示例大部分时间花在脚本执行上

  4. 打开 Task-Event Log 查看任务中具体质心的时序图,可以看到耗费高时刻以及对应的js脚本名称

  5. 双击脚本锚点进入对应的代码行,这是高德地图API内部脚本,我们隐约可以看得出来它在帧内执行了某个计算量大的函数,由此知道在执行逐帧方法里肯定调用了高德地图的方法。

  6. 排查我们自己代码里的逐帧方法,果然存在一个map.render()方法,它的作用是强制让地图重新渲染,以激活自定义图层的内容重新渲染,并与地图的渲染结果进行合并绘制。

  7. 知道了原因后有两个选择,一是调整造成问题的方法,一是规避该方法。由于map.render()是个非开源API的方法,我们选择后者,通过独立渲染图层的方式规避"图层内容与地图渲染结果合并绘制"这一步。 优化前后性能监测见下图,CPU占比没有维持在90%以上了,js内存占用率也有所下降。

总结

在这次实践中,我们发现问题原因,是高德提供的自定义可视化GLCustomLayer图层必须依赖map.render(),因为它的原理是将map渲染的结果与自定义图层的结果合并后绘制到canvas,如果去除map.render(),那么底图会消失。解决方案是使用独立图层customLayer,不需要依赖map.render(),需要做的就是在viewChange时同步空间坐标就可以了。

唯一的缺陷就是无法展示map上建筑白模与自定义图层网格体的远近关系,网格体永远在map场景的前面,不过这个问题也不大,因为只要有足够的数据,我们可以自己渲染建筑白模,甚至自行定制建筑白模的外观和交互行为。在某些场景中地图的作用被弱化,同时它的资源占用率也可以被弱化,这是我们乐于看到的。

综上所述,做性能方面的优化工作,处理了掌握具体的排查步骤,还需要对代码的业务逻辑有足够的认识,才能够快速定位找到原因和解决方法。

相关链接

前端性能优化 --- 保姆级 Performance 工具使用指南

相关推荐
前端摸鱼匠36 分钟前
Vue 3 的v-bind合并行为:讲解v-bind与普通属性合并的规则
前端·javascript·vue.js·前端框架·ecmascript
REDcker1 小时前
浏览器端Web程序性能分析与优化实战 DevTools指标与工程清单
开发语言·前端·javascript·vue·ecmascript·php·js
donecoding2 小时前
一个 sudo 引发的血案:npm 全局包权限错乱彻底修复
前端·node.js·前端工程化
风骏时光牛马3 小时前
Raku正则匹配与数据批量处理实操案例
前端
nbwenren3 小时前
2026实测:Gemini 3 镜像站视觉能力实践——拍照原型图,一键生成 HTML+CSS 代码
前端·css·html
Lee川3 小时前
Prisma 实战指南:像搭积木一样设计古诗词数据库
前端·数据库·后端
jinanwuhuaguo3 小时前
(第二十九篇)OpenClaw 实时与具身的跃迁——从异步孤岛到数字世界的“原住民”
前端·网络·人工智能·重构·openclaw
广州华水科技3 小时前
深度测评2026年单北斗GNSS位移监测系统推荐,与高口碑变形监测设备一同引领行业新风尚
前端
Alice-YUE4 小时前
【js高频八股】防抖与节流
开发语言·前端·javascript·笔记·学习·ecmascript