近期遇到了一个echarts坐标轴指示器(axisPointer)移动延迟问题,把我最后的解决方案分享给你们javascript
问题现象
一、echarts官网上demo上调好后,鼠标移动,指示器跟着移动速度很快很是流畅
二、到项目(ANG2项目)里面后,指示器在鼠标移动时大概有一秒的延迟后才跟随移动,代码如出一辙,差异在于在项目中。html
解决思路java
此前,由于echarts动画requestAnimationFrame在echarts对象销毁后并未清除动画,遗留动画一直存在,致使angular2的zone.js一直检测变化,引发性能问题。所以使用了ngZone.runOutsideAngular的方法不检测echarts的变动。
有了这个历史缘由,那么也排除了变动检测的问题。angular2
怀疑1,项目页面上有大量消耗性能的代码在长期执行,鼠标移动时该部分代码占据了时间致使延迟。
怀疑2,echarts的配置项不合理echarts
分析事件执行
一、本地写了个echarts图的html文件,用谷歌自带的性能分析工具记录10s的状况,期间一直移动鼠标指示器跟着移动很是快
分析图形中的mousemove事件,响应很是快,大多数是1ms、2ms
(公司限制图片上传)
二、一样操做记录10s项目中的echarts图,mousemove事件耗时10~20ms,相差10倍。对比Event Log中的事件,发现TooltipContent.js代码执行16ms,占了很大一部分时间。
(公司限制图片上传)ide
TooltipContent.js是什么呢?是echarts的中的代码。
更改源码是不靠谱滴,所以咱们分析执行这坨代码的老被调戏的缘由。
发现option的tooltip中配置了 trigger: 'axis',trigger是触发器,设置了该值鼠标移动一定会触发Tooltip模块的某些方法,暂时去掉trigger,卡顿消失。工具
结论:使用tooltip设置trigger:'axis'触发器显示坐标轴指示器,会增长页面性能消耗,用axisPointer设置解决该问题
从该角度入手,对代码作以下处理,问题解决:性能
option = { axisPointer: { // 会出现横竖2个方向的指示器 show: true, type: 'line', label:{ show: false, //不显示指示器的文本标签 }, }, yAxis: [ //不显示竖向的指示器 { axisPointer: { show: false, }, } ], };